精华内容
下载资源
问答
  • Python显示文本

    千次阅读 2016-09-01 17:22:13
    使用基本的控件工作   wxPython 工具包提供了多种不同的窗口部件,包括了本章所提到的基本控件。我们涉及静态文本、可编辑的文本、按钮、微调、滑块、复选框、单选...这一节以在屏幕上显示文本的例子作为开始,

    使用基本的控件工作

     

    wxPython 工具包提供了多种不同的窗口部件,包括了本章所提到的基本控件。我们涉及静态文本、可编辑的文本、按钮、微调、滑块、复选框、单选按钮、选择器、列表框、组合框和标尺。对于每种窗口部件,我们将提供一个关于如何使用它的简短例子,并附上相关的wxPython API 的说明。

     

    显示文本

     

    这一节以在屏幕上显示文本的例子作为开始,包括用作标签的静态文本域,有样式和无样式的都使用了。你可以创建用于用户输入的单行和多行文本域。另外,我们将讨论如何选择文本的字体。

     

    如何显示静态文本?

     

    大概对于所有的UI 工具来说,最基本的任务就是在屏幕上绘制纯文本。在wxPython 中,使用类wx.StaticText 来完成。图7.1显示了这个静态文本控件。

    w7.1.gif

     

    wx.StaticText 中,你能够改变文本的对齐方式、字体和颜色。简单的静态文本控件可以包含多行文本,但是你不能处理多种字体或样式。处理多种字体或样式,要使用更精细的文本控件,如wx.html.HTMLWindow ,它在第十六章中说明。为了在静态文本控件中显示多行文本,我们要包括其中有换行符的字符串,并使控件的大小足够显示所有的文本。有一个特点是你在图7.1中所不能看到的,那就是wx.StaticText 窗口不会接受或响应鼠标事件。

     

    如何显示静态文本

     

    例子7.1显示了产生图7.1的代码。

     

    例7.1 如何使用静态文本的一个基本例子

     

    Python代码  收藏代码
    1. import wx  
    2.   
    3. class StaticTextFrame(wx.Frame):  
    4.     def __init__(self):  
    5.         wx.Frame.__init__(selfNone, -1'Static Text Example',   
    6.                 size=(400300))  
    7.         panel = wx.Panel(self, -1)  
    8.   
    9.         # 这是一个基本的静态文本  
    10.         wx.StaticText(panel, -1"This is an example of static text",   
    11.                 (10010))  
    12.   
    13.         # 指定了前景色和背景色的静态文本  
    14.         rev = wx.StaticText(panel, -1"Static Text With Reversed Colors",   
    15.                 (10030))  
    16.         rev.SetForegroundColour('white')  
    17.         rev.SetBackgroundColour('black')  
    18.   
    19.         # 指定居中对齐的的静态文本  
    20.         center = wx.StaticText(panel, -1"align center", (10050),   
    21.                 (160, -1), wx.ALIGN_CENTER)  
    22.         center.SetForegroundColour('white')  
    23.         center.SetBackgroundColour('black')  
    24.   
    25.         # 指定右对齐的静态文本  
    26.         right = wx.StaticText(panel, -1"align right", (10070),   
    27.                 (160, -1), wx.ALIGN_RIGHT)  
    28.         right.SetForegroundColour('white')  
    29.         right.SetBackgroundColour('black')  
    30.   
    31.         # 指定新字体的静态文本  
    32.         str = "You can also change the font."  
    33.         text = wx.StaticText(panel, -1, str, (20100))  
    34.         font = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.NORMAL)  
    35.         text.SetFont(font)  
    36.   
    37.         # 显示多行文本  
    38.         wx.StaticText(panel, -1"Your text\ncan be split\n"  
    39.                 "over multiple lines\n\neven blank ones", (20,150))  
    40.   
    41.         #显示对齐的多行文本  
    42.         wx.StaticText(panel, -1"Multi-line text\ncan also\n"  
    43.                 "be right aligned\n\neven with a blank", (220,150),   
    44.                 style=wx.ALIGN_RIGHT)  
    45.   
    46.   
    47. if __name__ == '__main__':  
    48.     app = wx.PySimpleApp()  
    49.     frame = StaticTextFrame()  
    50.     frame.Show()  
    51.     app.MainLoop()  
     

    wx.StaticText 的构造函数和基本的wxWidget 构造函数相同,如下所示:

     

    Python代码  收藏代码
    1. wx.StaticText(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="staticText")  
     

     

    表7.1说明了这些参数——大多数的wxPython 窗口部件都有相类似的参数。对于构造函数的参数的更详细的说明,请参见第2章的相关论述。

     

    表7.1 wx.StaticText 构造函数的参数

     

    parent :父窗口部件。

    id :标识符。使用-1可以自动创建一个唯一的标识。

    label :你想显示在静态控件中的文本。

    pos :一个wx.Point 或一个Python 元组,它是窗口部件的位置。

    size :一个wx.Size 或一个Python 元组,它是窗口部件的尺寸。

    style :样式标记。

    name :对象的名字,用于查找的需要。

    接下来我们更详细地讨论样式标记。

     

    使用样式工作

    所有在例7.1中静态文本实例所调用的方法都是属于基父类wx.Window 的;wx.StaticText 没有定义任何它自己的新方法。表7.2列出了一些专用于wx.StaticText 的样式。

     

    表7.2

    wx.ALIGN_CENTER :静态文本位于静态文本控件的中心。

    wx.ALIGN_LEFT :文本在窗口部件中左对齐。这是默认的样式。

    wx.ALIGN_RIGHT :文本在窗口部件中右对齐。

    wx.ST_NO_AUTORESIZE :如果使用了这个样式,那么在使用了SetLabel() 改变文本之后,静态文本控件不将自我调整尺寸。你应结合使用一个居中或右对齐的控件来保持对齐。

     

    wx.StaticText 控件覆盖了SetLabel() ,以便根据新的文本来调整自身,除非wx.ST_NO_AUTORESIZE 样式被设置了。

    当创建了一个居中或右对齐的单行静态文本时,你应该显式地在构造器中设置控件的尺寸。指定尺寸以防止wxPython 自动调整该控件的尺寸。wxPython 的默认尺寸是刚好包容了文本的矩形尺寸,因此对齐就没有什么必要。要在程序中动态地改变窗口部件中的文本,而不改变该窗口部件的尺寸,就要设置wx.ST_NO_AUTORESIZE 样式。这样就防止了在文本被重置后,窗口部件自动调整尺寸到刚好包容了文本。如果静态文本是位于一个动态的布局中,那么改变它的尺寸可能导致屏幕上其它的窗口部件移动,这就对用户产生了干扰。

     

    其它显示文本的技术

     

    还有其它的方法来显示文本。其中之一就是wx.lib.stattext.GenStaticText 类,它是wx.StaticText 的纯Python实现。它比标准C++版的跨平台性更好,并且它接受鼠标事件。当你想子类化或创建你自己的静态文本控件时,它是更可取的。

     

    你可以使用DrawText(text , x,y) 和DrawRotatedText(text , x, y, angle) 方法直接绘制文本到你的设备上下文。后者是显示有一定角度的文本的最容易的方法,尽管GenStaticText 的子类也能处理旋转问题。设备上下文在第6章中做了简短的说明,我们将在第12章中对它做更详细的说明。

     

    如何让用户输入文本?

     

    超越纯粹显示静态文本,我们将开始讨论当输入文本时的用户交互。wxPython 的文本域窗口部件的类是wx.TextCtrl ,它允许单行和多行文本输入。它也可以作为密码输入控件,掩饰所按下的按键。如果平台支持的话,wx.TextCtrl 也提供丰富格式文本的显示,通过使用所定义和显示的多文本样式。图7.2显示了一个作为单行控件的wx.TextCtrl 的样板。其中的密码输入框对密码进行了掩饰。

     

    w7.2.gif

     

    接下来,我们将演示如何创建文本,然后讨论文本控件的样式选项。

     

    如何创建文本输入控件

     

    例子7.2显示了用于生成图7.2的代码

     

    例7.2 wx.TextCtrl 的单行例子

     

    Python代码  收藏代码
    1. import wx  
    2.   
    3. class TextFrame(wx.Frame):  
    4.   
    5.     def __init__(self):  
    6.         wx.Frame.__init__(selfNone, -1'Text Entry Example',   
    7.                 size=(300100))  
    8.         panel = wx.Panel(self, -1)   
    9.         basicLabel = wx.StaticText(panel, -1"Basic Control:")  
    10.         basicText = wx.TextCtrl(panel, -1"I've entered some text!",   
    11.                 size=(175, -1))  
    12.         basicText.SetInsertionPoint(0)  
    13.   
    14.         pwdLabel = wx.StaticText(panel, -1"Password:")  
    15.         pwdText = wx.TextCtrl(panel, -1"password", size=(175, -1),   
    16.                 style=wx.TE_PASSWORD)  
    17.         sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)  
    18.         sizer.AddMany([basicLabel, basicText, pwdLabel, pwdText])  
    19.         panel.SetSizer(sizer)  
    20.   
    21. if __name__ == '__main__':  
    22.     app = wx.PySimpleApp()  
    23.     frame = TextFrame()  
    24.     frame.Show()  
    25.     app.MainLoop()  
     

     

    wx.TextCtrl 类的构造函数较小且比其父类wx.Window 更精细,它增加了两个参数:

     

    wx.TextCtrl(parent , id , value = "", pos =wx.DefaultPosition , size =wx.DefaultSize , style =0, validator=wx.DefaultValidator name =wx.TextCtrlNameStr)

     

    参数parent , id , pos , size , style , 和 name 与wx.Window 构造函数的相同。value 是显示在该控件中的初始文本。

    validator 参数用于一个wx.Validator 。validator 通常用于过虑数据以确保只能键入要接受的数据。将在第9章对validator 做更详细的讨论。

     

    使用单行文本控件样式

     

    这里,我们将讨论一些唯一无二的文本控件样式。 表7.3说明了用于单行文本控件的样式标记

     

    表7.3 单行wx.TextCtrl 的样式

     

    wx.TE_CENTER :控件中的文本居中。

    wx.TE_LEFT :控件中的文本左对齐。默认行为。

    wx.TE_NOHIDESEL :文本始终高亮显示,只适用于Windows 。

    wx.TE_PASSWORD :不显示所键入的文本,代替以星号显示。

    wx.TE_PROCESS_ENTER :如果使用了这个样式,那么当用户在控件内按下回车键时,一个文本输入事件被触发。否则,按键事件内在的由该文本控件或该对话框管理。

    wx.TE_PROCESS_TAB :如果指定了这个样式,那么通常的字符事件在Tab 键按下时创建(一般意味一个制表符将被插入文本)。否则,tab 由对话框来管理,通常是控件间的切换。

    wx.TE_READONLY :文本控件为只读,用户不能修改其中的文本。

    wx.TE_RIGHT :控件中的文本右对齐。

     

    像其它样式标记一样,它们可以使用|符号来组合使用,尽管其中的三个对齐标记是相互排斥的。

    对于添加文本和移动插入点,该文本控件自动管理用户的按键和鼠标事件。对于该文本控件可用的命令控制组合说明如下:

    • ctrl -x :剪切 ctrl -c :复制 ctrl -v :粘贴 ctrl -z :撤消

     

    不输入的情况下如何改变文本?

     

    除了根据用户的输入改变显示的文本外,wx.TextCtrl 提供了在程序中改变显示的文本的一些方法。你可以完全改变文本或仅移动插入点到文本中不同的位置。表7.4列出了wx.TextCtrl 的文本处理方法。

     

    表7.4

     

    AppendText(text) :在尾部添加文本。

    Clear() :重置控件中的文本为“”。并且生成一个文本更新事件。

    EmulateKeyPress(event) :产生一个按键事件,插入与事件相关联的控制符,就如同实际的按键发生了。

    GetInsertionPoint() SetInsertionPoint(pos) SetInsertionPointEnd() :得到或设置插入点的位置,位置是整型的索引值。控件的开始位置是0。

    GetRange(from , to) :返回控件中位置索引范围内的字符串。

    GetSelection() GetStringSelection() SetSelection(from , to) :GetSelection() 以元组的形式返回当前所选择的文本的起始位置的索引值(开始,结束)。GetStringSelection() 得到所选择的字符串。SetSelection(from ,to) 设置选择的文本。

    GetValue() SetValue(value) :SetValue() 改变控件中的全部文本。GetValue() 返回控件中所有的字符串。

    Remove(from , to) :删除指定范围的文本。

    Replace(from , to , value) :用给定的值替换掉指定范围内的文本。这可以改变文本的长度。

    WriteText(text) :类似于AppendText() ,只是写入的文本被放置在当前的插入点。

     

    当你的控件是只读的或如果你根据事件而非用户键盘输入来改变控件中的文本是,这些方法是十分有用的。

     

    如何创建一个多行或样式文本控件?

     

    你可以使用wx.TE_MULTILINE 样式标记创建一个多行文本控件。如果本地窗口控件支持样式,那么你可以改变被控件管理的文本的字体和颜色样式,这有时被称为丰富格式文本。对于另外的一些平台,设置样式的调用被忽视掉了。图7.3显示了多行文本控件的一个例子。

     

    w7.3.gif

     

    例7.3包含了用于创建图7.3的代码。通常,创建一个多行文本控件是通过设置wx.TE_MULTILINE 样式标记来处理的。较后的部分,我们将讨论使用丰富文本样式。

     

    例7.3 创建一个多行文本控件

     

    Python代码  收藏代码
    1. import wx  
    2.   
    3. class TextFrame(wx.Frame):  
    4.   
    5.     def __init__(self):  
    6.         wx.Frame.__init__(selfNone, -1'Text Entry Example',   
    7.                 size=(300250))  
    8.         panel = wx.Panel(self, -1)   
    9.         multiLabel = wx.StaticText(panel, -1"Multi-line")  
    10.         multiText = wx.TextCtrl(panel, -1,  
    11.                "Here is a looooooooooooooong line of text set in the control.\n\n"  
    12.                "See that it wrapped, and that this line is after a blank",  
    13.                size=(200100), style=wx.TE_MULTILINE) #创建一个文本控件  
    14.         multiText.SetInsertionPoint(0#设置插入点  
    15.   
    16.         richLabel = wx.StaticText(panel, -1"Rich Text")  
    17.         richText = wx.TextCtrl(panel, -1,   
    18.                 "If supported by the native control, this is reversed, and this is a different font.",  
    19.                 size=(200100), style=wx.TE_MULTILINE|wx.TE_RICH2) #创建丰富文本控件  
    20.         richText.SetInsertionPoint(0)  
    21.         richText.SetStyle(4452, wx.TextAttr("white""black")) #设置文本样式  
    22.         points = richText.GetFont().GetPointSize()   
    23.         f = wx.Font(points + 3, wx.ROMAN, wx.ITALIC, wx.BOLD, True#创建一个字体  
    24.         richText.SetStyle(6882, wx.TextAttr("blue", wx.NullColour, f)) #用新字体设置样式  
    25.         sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)  
    26.         sizer.AddMany([multiLabel, multiText, richLabel, richText])  
    27.         panel.SetSizer(sizer)  
    28.   
    29. if __name__ == '__main__':  
    30.     app = wx.PySimpleApp()  
    31.     frame = TextFrame()  
    32.     frame.Show()  
    33.     app.MainLoop()  
     

    使用多行或丰富文本样式

     

    除了wx.TE_MULTILINE ,还有另外的样式标记,它们只在一个多行或丰富文本控件的上下文中有意义。表7.5列出了这些窗口样式。

     

    表7.5

     

    wx.HSCROLL :如果文本控件是多行的,并且如果该样式被声明了,那么长的行将不会自动换行,并显示水平滚动条。该选项在GTK +中被忽略。

    wx.TE_AUTO_URL :如果丰富文本选项被设置并且平台支持的话,那么当用户的鼠标位于文本中的一个URL 上或在该URL 上敲击时,这个样式将导致一个事件被生成。

    wx.TE_DONTWRAP :wx.HSCROLL 的别名。

    wx.TE_LINEWRAP :对于太长的行,以字符为界换行。某些操作系统可能会忽略该样式。

    wx.TE_MULTILINE :文本控件将显示多行。

    wx.TE_RICH :用于Windows 下,丰富文本控件用作基本的窗口部件。这允许样式文本的使用。

    wx.TE_RICH2 :用于Windows 下,把最新版本的丰富文本控件用作基本的窗口部件。

    wx.TE_WORDWRAP :对于太长的行,以单词为界换行。许多操作系统会忽略该样式。

     

    记住,上面这些样式可以组合使用,所以上面例子中的多行丰富文本控件使用wx.TE_MULTILINE | wx.TE_RICH2 来声明。

    用在wx.TextCtrl 窗口部件中的文本样式是类wx.TextAttr 的实例。wx.TextAttr 实例的属性有文本颜色、背景色、和字体,它们都能够在构造函数中被指定,如下所示:

    wx.TextAttr(colText , colBack =wx.NullColor , font =wx.NullFont)

     

    文本色和背景色是wxPython 对象,它们可以使用颜色名或颜色的RGB 值(红, 绿, 蓝)来指定。wx.NullColor 指明使用控件目前的背景色。font 是一个wx.Font 对象,我们将在下一小节讨论。wx.NullFont 对象指明使用当前默认字体。

     

    wx.TextAttr 有相关属性的get *()方法:GetBackgroundColour() , GetFont() , 和 GetTextColour() ,也有返回布尔值的验证存在性的方法:HasBackgroundColour() , HasFont() , 和 HasTextColour() 。如果属性包含一个默认值,则Has *()方法返回False 。如果所有这三个属性都包含默认值,则IsDefault() 方法返回true 。这个类没有set *()方法,因为wx.TextAttr 的实例是不可变的。要改变文本的样式,你必须创建一个实例。

     

    使用文本样式,要调用SetDefaultStyle(style) 或SetStyle(start , end ,style) 。第一个方法设置为控件当前的样式。任何插入到该控件中的文本,不管是键入的,或使用了AppendText() 或 WriteText() 方法的,都以该样式显示。如果样式的某个属性是默认的,那么该样式的当前值被保留。但是,如果样式的所有属性都是默认的,那么恢复默认样式。

     

    SetStyle() 与SetDefaultStyle(style) 类似,只是立即对位于start 和 end 位置之间的文本起作用。样式参数中的默认属性通过检查该控件的当前默认样式来解决。例7.3使用下面一行代码来反转文本中几个字符的颜色:

     

    richText.SetStyle(44 , 52, wx.TextAttr( "white ", "black "))

     

    背景色变为了黑色,相应的字符变为了白色。

    表7.6列出了wx.TextCtrl 的方法,它们在处理多行控件和丰富文本中是有用的。

     

    表7.6

    GetDefaultStyle() SetDefaultStyle(style) :上面已作了说明。

    GetLineLength(lineNo) :返回给定行的长度的整数值。

    GetLineText(lineNo) :返回给定行的文本。

    GetNumberOfLines() :返回控件中的行的数量。对于单行,返回1。

    IsMultiLine() IsSingleLine() :布尔类型的方法,确定控件的状态。

    PositionToXY(pos) :指定文本内的一个整数值位置,返回以元组(列,行)形式的索引位置。列和行的索引值均以0作为开始。

    SetStyle(start , end ,style) :立即改变指定范围内文本的样式。

    ShowPosition(pos) :引起一个多行控件的滚动,以便观察到指定位置的内容。

    XYToPosition(x , y) :与PositionToXY(pos) 相反——指定行和列,返回整数值位置。

     

    如果你能在系统中使用任意字体的话,那么就可以更加灵活的创建样式。 接下来,我们将给你展示如何创建和使用字体实例。

     

    如何创建一个字体?

     

    字体是类wx.Font 的实例。你所访问的任何字体,它已经被安装并对于基本的系统是可访问的。创建一个字体实例,要使用如下的构造函数:

     

    Python代码  收藏代码
    1. wx.Font(pointSize, family, style, weight, underline=False, faceName="", encoding=wx.FONTENCODING_DEFAULT)  
     

    pointSize 是字体的以磅为单位的整数尺寸。family 用于快速指定一个字体而无需知道该字体的实际的名字。字体的准确选择依赖于系统和具体可用的字体。可用的字体类别的示例显示在表7.7中。你所得到的精确的字体将依赖于你的系统。

     

    表7.7

    wx.DECORATIVE :一个正式的,老的英文样式字体。

    wx.DEFAULT :系统默认字体。

    wx.MODERN :一个单间隔(固定字符间距)字体。

    wx.ROMAN :serif 字体,通常类似于Times New Roman 。

    wx.SCRIPT :手写体或草写体

    wx.SWISS :sans -serif 字体,通常类似于Helvetica 或Arial 。

     

    style 参数指明字体的是否倾斜,它的值有:wx.NORMAL , wx.SLANT , 和 wx.ITALIC 。同样,weight 参数指明字体的醒目程度,可选值有:wx.NORMAL , wx.LIGHT ,或wx.BOLD 。这些常量值的行为根据它的名字就可以知道了。underline 参数仅工作在Windows 系统下,如果取值为True ,则加下划线,False 为无下划线。 faceName 参数指定字体名。

     

    encoding 参数允许你在几个编码中选择一个,它映射内部的字符和字本显示字符。编码不是Unicode 编码,只是用于wxPython 的不同的8位编码。大多数情况你可以使用默认编码。

     

    为了获取系统的有效字体的一个列表,并使用户可用它们,要使用专门的类wx.FontEnumerator ,如下所示:

    e = wx.FontEnumerator() e.EnumerateFacenames() fontList = e.GetFacenames()

    要限制该列表为固定宽度,就要将上面的第一行改为e = wx.FontEnumerator(fixedWidth =True) 。

     

    如果我们系统不支持丰富文本,那么我还能使用样式文本吗?

     

    可以。在wxPython 中有一个跨平台的样式文本窗口部件,名为wx.stc.StyledTextCtrl ,它是Python 对Scintilla丰富文本组件的封装。因为Scintilla 不是wxWidgets 的一部分,而是作为一个独立的第三方组被合并到了wxPython 中,所以它不与我们已经讨论过的类共享相同的API 。wx.stc.StyledCtrl 的完整说明超过了我们要讲的范围,但是你可以在http: //wiki.wxpython.org /index.cgi /wxStyledTextCtrl 找到相关的文档。

     

    如果我的文本控件不匹配我的字符串该怎么办?

     

    当使用多行wx.TextCtrl 的时候,要知道的一点是,该文本控件是以何种方式存储字符串的。在内部,存储在该wx.TextCtrl 中的多行字符是以\n作为行的分隔符的。这与基本的操作系统无关,即使某些系统使用了不同的字符组合作为一行的分隔符。当你使用GetValue() 来获取该字符串时,原来的行分隔符被还原,因此你不必考虑手工转换。这个的好处就是控件中的文本不依赖于任何特定的操作系统。

     

    缺点是,文本控件中的行的长度和行的索引与它们在文本控件外的可能是不同的。例如,如果你在一个Windows 系统上,系统所用的行分隔符是\r\n,通过GetValue() 所得知的字符串的长度将比通过GetLastPosition() 所得知的字符串的结尾长。通过在例7.3中增加下面两行:

     

    print "getValue ", len(multiText.GetValue()) print "lastPos ", multiText.GetLastPosition()

     

    我们在Unix 系统上所得的结果应该是:

    getValue 119 lastPos 119

     

    我们在Windows 系统上所得的结果应该是:

    getValue 121 lastPos 119

     

    这意味你不应该使用多行文本控件的位置索引来取得原字符串,位置索引应该用作wx.TextCtrl 的另外方法的参数。对于该控件中的文本的子串,应该使用GetRange() 或GetSelectedText() 。也不要反向索引;不要使用原字符串的索引来取得并放入文本控件中。下面是一个例子,它使用了不正确的方法在插入点之后直接得到10个字符:

     

    Python代码  收藏代码
    1. aLongString = """Any old 
    2. multi line string 
    3. will do here. 
    4. Just as long as 
    5. it is multiline"""  
    6. text = wx.TextCtrl(panel, -1, aLongString, style=wx.TE_MULTILINE)  
    7. x = text.GetInsertionPoint()  
    8. selection = aLongString[x : x + 10### 这将是不正确的  
     

    Windows 或Mac 系统中要得到正确的结果,最后一行应换为:

    selection = text.GetRange(x , x + 10)

     

    如何响应文本事件?

     

    有一个由wx.TextCtrl 窗口部件产生的便利的命令事件,你可能想用它。你需要把相关事件传递给Bind 方法以捕获该事件,如下所示:

    frame.Bind(wx.EVT_TEXT , frame.OnText , text)

    表7.8说明了这些命令事件。

     

    表7.8 wx.TextCtrl 的事件

    EVT_TEXT :当控件中的文本改变时产生该事件。文本因用户的输入或在程序中使用SetValue() 而被改变,都要产生该事件。

    EVT_TEXT_ENTER :当用户在一个wx.TE_PROCESS_ENTER 样式的文本控件中按下了回车键时,产生该事件。

    EVT_TEXT_URL :如果在Windows 系统上,wx.TE_RICH 或wx.TE_RICH2 样式被设置了,并且wx.TE_AUTO_URL 样式也被设置了,那么当在文本控件内的URL 上发生了一个鼠标事件时,该事件被触发。

    EVT_TEXT_MAXLEN :如果使用SetMaxLength() 指定了该控件的最大长度,那么当用户试图输入更长的字符串时,该事件被触发。你可能会用这个,例如,这时给用户显示一个警告消息。

     

    实例1:

     

    Python代码  收藏代码
    1. # experiments with wx.StaticText(), set a font for the text  
    2. # tested with Python25 and wxPython28      vegaseat     02oct2007  
    3.   
    4. import wx  
    5.   
    6. class MyFrame(wx.Frame):  
    7.     def __init__(self, parent, id, title, data):  
    8.         wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size=(500380))  
    9.         panel = wx.Panel(self, -1)  
    10.   
    11.         # font type: wx.DEFAULT, wx.DECORATIVE, wx.ROMAN, wx.SCRIPT, wx.SWISS, wx.MODERN  
    12.         # slant: wx.NORMAL, wx.SLANT or wx.ITALIC  
    13.         # weight: wx.NORMAL, wx.LIGHT or wx.BOLD  
    14.         #font1 = wx.Font(10, wx.SWISS, wx.ITALIC, wx.NORMAL)  
    15.         # use additional fonts this way ...  
    16.         font1 = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL, False, u'Comic Sans MS')  
    17.   
    18.         text1 = wx.StaticText(panel, -1, data, pos=(20,15))  
    19.         text1.SetFont(font1)  
    20.         # center frame on screen  
    21.         self.Center()  
    22.         # show the frame  
    23.         self.Show(True)  
    24.   
    25.   
    26. data = """\ 
    27. Al Gore:  The Wild Years 
    28. America's Most Popular Lawyers 
    29. Career Opportunities for History Majors 
    30. Different Ways to Spell "Bob" 
    31. Dr. Kevorkian's Collection of Motivational Speeches 
    32. Ethiopian Tips on World Dominance 
    33. Everything Men Know About Women 
    34. Everything Women Know About Men 
    35. One Hundred and One Spotted Owl Recipes by the EPA 
    36. Staple Your Way to Success 
    37. The Amish Phone Book 
    38. The Engineer's Guide to Fashion 
    39. Ralph Nader's list of pleasures"""  
    40.   
    41. application = wx.PySimpleApp()  
    42. # create instance of class MyFrame  
    43. window = MyFrame(None, -1"The World's Shortest Books", data)  
    44. # start the event loop  
    45. application.MainLoop()  
     

    实例2

     

    Python代码  收藏代码
    1. import wx  
    2.   
    3. if __name__ == "__main__":  
    4.     app = wx.PySimpleApp()  
    5.     dialog = wx.FontDialog(None, wx.FontData())  
    6.     if dialog.ShowModal() == wx.ID_OK:  
    7.         data = dialog.GetFontData()  
    8.         font = data.GetChosenFont()  
    9.         colour = data.GetColour()  
    10.         print 'You selected: "%s", %d points\n' % (  
    11.                 font.GetFaceName(), font.GetPointSize())  
    12.     dialog.Destroy()  
    展开全文
  • 首先,大致了解以下Windows的任务栏,任务栏实质上是一个容器(类名为“Shell_TaryWnd”),在这个容器中有个二级容器(类名为“ReBarWindow32”),在这个二级容器中还有一个类名为“MSTaskSwWClass”的窗口,用来存放...

    效果展示

    任务栏整体展示

    任务栏简介

    首先,大致了解以下Windows的任务栏,任务栏实质上是一个容器(类名为“Shell_TaryWnd”),在这个容器中有个二级容器(类名为“ReBarWindow32”),在这个二级容器中还有一个类名为“MSTaskSwWClass”的窗口,用来存放最小化后的窗口,他的窗口和“ReBarWindow32”的大小相同。

    为了更加直观的理解,如图所示,红色部分为“Shell_TaryWnd”,黄色部分为“ReBarWindow32”,蓝色部分为“MSTaskSwWClass”。

    任务栏描述

    将窗口嵌入任务栏

    想要把窗口嵌入到任务栏中,其实就是将窗口放入“ReBarWindow32”容器中,但是为了不遮挡“MSTaskSwWClass”中的图标,我们需要重新调整“MSTaskSwWClass”容器的大小,为我们自己的窗口留出位置。

    在python中,我们可以使用win32gui来获取这三个容器的句柄,然后通过句柄获得窗口的位置及尺寸。

    首先,需要找到任务栏“Shell_TaryWnd”的窗口句柄(win32gui.FindWindow用来返回窗口句柄):

    m_hTaskbar = win32gui.FindWindow("Shell_TrayWnd", None)
    

    其次,找到他的子窗口“ReBarWindow32”的窗口句柄(win32gui.FindWindowEx用来找窗口中的子窗口):

    m_hBar = win32gui.FindWindowEx(m_hTaskbar, 0, "ReBarWindow32", None)
    

    然后,找到m_hBar的子窗口“MSTaskSwWClass”的窗口句柄:

    m_hMin = win32gui.FindWindowEx(m_hBar, 0, "MSTaskSwWClass", None)
    

    这样,三个容器的句柄都拿到了,此时m_hBar和m_hMin的窗口位置和大小是相同的,我们通过win32gui.MoveWindow需要调整m_hMin的窗口大小,为我们的程序预留出位置:

    b = win32gui.GetWindowRect(m_hBar)  # 获取m_hBar窗口尺寸b为[左,上,右,下]的数组
    win32gui.MoveWindow(m_hMin, 0, 0, b[2] - b[0] - 200, b[3] - b[1], True)
    

    其中,我们将m_hMin的有边界向左调整了,在右侧留出了200像素的空间用来存放我们自己的窗口。

    接下了,我们需要调整我们自己的窗口到预留位置的大小,以PyQt5为例:

    self.setGeometry(b[2] - b[0] - 200, 0, 200, b[3] - b[1])
    

    然后,将我们自己的窗口设置为m_hBar的子窗口:

    win32gui.SetParent(int(self.winId()), m_hBar)  # 设置任务栏为此窗口的父窗口
    

    这样就完成了将自己的窗口嵌入到任务栏的所有步骤了。

    完整代码

    点击查看:但行趣事博客坞

    下面是我自己运营的微信小程序“但行趣事”和公众号“微电脑”,更多的技术文章以及视频我会放到小程序和公众号当中,有志同道合的小伙伴也可以在小程序(联系客服按钮)或者公众号(直接留言)当中联系我们

    但行趣事小程序
    微电脑公众号
    展开全文
  • 作者整理了一个python开发的脚本,功能是添加文本显示窗口,作为范例,源代码如下: # The following sample shows how to creates a custom windows form # with a textbox that can be used to define the text ...

      犀牛软件是一款专业的三维设计软件。简单实用方便,在三维矢量领域有着广泛的用途,开发拓展这款软件的插件,可以方便设计师摆脱一些繁重的重复劳动,有着现实的需求。作者整理了一个python开发的脚本,功能是添加文本和显示窗口,作为范例,源代码如下:

    # The following sample shows how to creates a custom windows form
    # with a textbox that can be used to define the text in a new text dot
    from System.Windows.Forms import Form, DialogResult, Label, Button, TextBox
    from System.Drawing import Point, Size
    import rhinoscript.selection
    import rhinoscript.geometry
    
    # Our custom form class
    class AnnotateForm(Form):
      # build all of the controls in the constructor
      def __init__(self, curveId):
        offset = 10
        self.Text = "Annotate Curve"
        crvlabel = Label(Text="Curve ID = "+str(curveId), AutoSize=True)
        self.Controls.Add(crvlabel)
        width = crvlabel.Right
        pt = Point(crvlabel.Left,crvlabel.Bottom + offset)
        labelstart = Label(Text="Text at start", AutoSize=True)
        labelstart.Location = pt
        self.Controls.Add(labelstart)
        pt.X = labelstart.Right + offset
        inputstart = TextBox(Text="Start")
        inputstart.Location = pt
        self.Controls.Add(inputstart)
        if( inputstart.Right > width ):
          width = inputstart.Right
        self.m_inputstart = inputstart
    
        pt.X  = labelstart.Left
        pt.Y  = labelstart.Bottom + offset*3
        buttonApply = Button(Text="Apply", DialogResult=DialogResult.OK)
        buttonApply.Location = pt
        self.Controls.Add(buttonApply)
        pt.X = buttonApply.Right + offset
        buttonCancel = Button(Text="Cancel", DialogResult=DialogResult.Cancel)
        buttonCancel.Location = pt
        self.Controls.Add(buttonCancel)
        if( buttonCancel.Right > width ):
          width = buttonCancel.Right
        self.ClientSize = Size(width, buttonCancel.Bottom)
        self.AcceptButton = buttonApply
        self.CancelButton = buttonCancel
      
      def TextAtStart(self):
        return self.m_inputstart.Text
    
    
    # prompt the user to select a curve
    curveId = rhinoscript.selection.GetObject("Select a curve",rhinoscript.selection.filter.curve)
    if( curveId==None ):
      print "no curve selected"
    else:
      location = rhinoscript.curve.CurveStartPoint(curveId)
      if( location!=None ):
        form = AnnotateForm(curveId)
        if( form.ShowDialog() == DialogResult.OK ):
          # this block of script is run if the user pressed the apply button
          text = form.TextAtStart()
          if( len(text) > 0 ):
            #create a new text dot at the start of the curve
            rhinoscript.geometry.AddTextDot(text, location)
    
    

      合理的脚本代码可以有效的提高工作效率,减少重复劳动。


      欢迎光临知了软件开发网络平台,本公司定制开发各类软件,主要方向为桌面专业软件开发和插件定制开发,桌面软件主要包括文字图形识别类软件,信息管理类软件,3D打印类软件,视频类软件以及其它涉及专业的各类图形图像处理软件。插件包含AE插件,AI插件,PS插件,PDF插件,3DMAX插件以及Word,Excel等Office插件开发。详情请咨询,微信QQ:312117271,手机:18928899728,邮箱: anjingzhi_sea@163.com.
    公司网址:http://www.zhiliaos.com

    展开全文
  • 因此,我知道如何执行python脚本并使用os.command甚至子进程将其输出到命令...即执行python脚本,将输出捕获到文本文件,并在命令窗口显示?如果这不可能,这是另一个问题:我要执行的命令最多需要8分钟才能完成,...

    因此,我知道如何执行python脚本并使用os.command甚至子进程将其输出到命令窗口中。我也知道捕获输出到文本文件是通过os.command("my command> me.txt"完成的。

    我的问题是:

    有没有办法用一个命令同时做这两个事情?即执行python脚本,将输出捕获到文本文件,并在命令窗口中显示?

    如果这不可能,这是另一个问题:

    我要执行的命令最多需要8分钟才能完成,并在一个文本文件中最多写入300行。我可以在命令仍在执行时访问文本文件以获取一些数据,而不必等待命令完成执行吗?例如每1分钟访问一次文本文件?

    如果两者都不可行,那么也可以完成此工作:

    当我的命令成功执行时,它会在cmd以及许多其他行上打印出一条Done语句。我可以在cmd中检查是否已打印"完成"字符串,或者是否需要在文本文件中捕获该字符串才能进行破坏活动?

    您是在谈论将子流程的结果同时打印到文件和stdout还是在引用python文件本身的所有输出?这是两个完全不同的问题。对于重定向所有python执行输出,请查看以下文章:stackoverflow.com/questions/14906764/

    您是否尝试过此.script.py > output.txt | type output.txt?

    鲍勃,我说的是将子流程的结果同时打印到文件和stdout中,而不是在打印python文件时

    对不起,您的命令在我每次运行时都会崩溃。它在cmd和文本文件中打印第1 2行,然后崩溃

    也许您可以用此答案中描述的类的实例替换stdout。

    martineau,我遇到了与Pvel相同的问题。它在cmd上运行的前30秒运行良好,但随后崩溃给出错误,并且在txt文件中只打印数字8,我猜这是错误号。伙计们要记住,Im正在运行的命令是要执行和完成的很长的命令,因此,当应该同时在cmd和txt文件上执行该命令时,为什么它总是崩溃是有道理的(就像它在操作系统中两次调用该命令一样)行)..

    好的,这种方法可能有助于解决问题:当我的命令成功执行后,它会在cmd上打印出一条Done语句,以及在它之前执行的其他许多行。我可以在cmd中检查是否已打印"完成"字符串,或者是否需要在文本文件中捕获该字符串才能进行搜索?

    您也可以检查一下stackoverflow.com/questions/2996887/

    wmz,您的解决方案非常有帮助。解决最初的问题并没有奏效,但是我可以使用该脚本以另一种方法实现目标

    在将命令输出回显至标准输出时,保存命令输出的最简单方法是使用tee:

    1$ python script.py | tee logfile.log

    如果要在写入文件时跟踪文件的输出,请使用tail:

    1$ tail -f logfile

    您可能希望立即unbuffer或flush输出,以便能够在填满整行或缓冲区之前读取输出:

    1

    2$ unbuffer python script.py > logfile

    $ tail -f logfile

    要么

    1print ("to file..", flush = True)

    我设计的更简单的方法是创建一个可以同时打印到屏幕和文件的功能。 当您输入输出文件名作为参数时,以下示例适用:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12OutputFile= args.Output_File

    if args.Output_File:

    OF = open(OutputFile, "w")

    def printing(text):

    print text

    if args.Output_File:

    OF.write(text +"

    ")

    #To print a line_of_text both to screen and file all you need to do is:

    printing(line_of_text)

    如果您可以从脚本中而不是命令行中执行此操作,那将非常容易。

    1

    2

    3with open("output.txt","w") as output:

    print>>output,"what you want as output" #prints to output file

    print"what you want as output" #prints to screen

    好友,您的脚本在cmd中启动,但在几秒钟后崩溃,并且不会在txt文件中打印任何内容。 因此,当我像您的示例那样优先显示一行或两行时,它非常有效,但是当我在两个ines中都使用os.system执行命令时,它就会崩溃。

    展开全文
  • 编辑器: (1)sublime ...打开命令行窗口(如在Windows中打开cmd命令窗口),把当前目录切换到该程序所在目录位置,在cmd下输入程序文件名(文件名后缀.py)运行,得出程序运行结果显示在cmd页面,。 ...
  • 学习python第一节课:MAC OS系统安装python3以及文本编辑器Sublime Text安装及配置 (一) 在苹果电脑上安装python编程环境: a) 大多数OS X系统都默认安装了Python。 检查是否安装了python,在文件夹Applications...
  • 我试图做一个窗口,将显示一些文本(beta)和将显示两个小矩形,我想使按钮。在import sysimport pygamefrom pygame.locals import *pygame.init()size = width, height = 720, 480speed = [2, 2]black = (0...
  • python的语法高亮显示。 对其他语言的部分支持。 突出显示当前在光标下出现的所有标识符。 用pyflakes整理python 3 在边栏上显示掉毛结果。 内联消息弹出窗口。 向后和向前搜索(尚无正则表达式) 编辑器和...
  • OBS Python脚本,可让您在文本源中显示正常运行时间。 安装 以.zip格式下载此存储库,解压缩并将livetime.py移到OBS脚本目录中。 这是一个python文件,因此您需要安装最新的OBS支持版本的 。 通过“脚本”窗口中的...
  • 我试图做一个窗口,将显示一些文本(beta)和将显示两个小矩形,我想使按钮。在import sysimport pygamefrom pygame.locals import *pygame.init()size = width, height = 720, 480speed = [2, 2]black = (0...
  • 1. 读取text.txt中文本,显示到命令行窗口中 2. 去掉每行开头的空格,将每行中的“Oh yes!”替换为“haha”,将替换后的内容写回到text.txt中 3. text.txt中只到number 8,补充number 9 - number 100,写到text.txt...
  • 界面分往返2个窗口,分别统计及绘图 4>把每次的结果存储到文本文件内生成log文件 5>控制器能够简单的进行如下控制 5.1>按下启动按钮,无杆气缸带着压力传感器从原始位置进行正向移动 5.2>到了正向限位后,...
  • 使用Python的GUI库Tkinter构建的类似记事本的文本编辑器 特征 文件 提供诸如“新建”,“保存”,“另存为”和“退出”之类的选项,以及使用快捷键访问所有选项的功能。 单击退出会打开一个窗口,询问用户是否要保存...
  • 显示最近的文件/文档列表和快速启动操作列表(与文本关联的图标)。 这个python软件包的目的是提供一个类,以快速创建漂亮的主窗口以在任何PySide应用程序中使用。 它有两种配色方案,一个白色/浅灰色主题...
  • Python tkinter - 第10章 文本控件(Text)属性

    万次阅读 多人点赞 2019-09-11 08:20:49
    可以把文字、标识(marks)、图片以及嵌入式的窗口放置到文本控件中。在不同的区域可以显示不同的格式。如果把回调函数于不同区域的事件联系起来,还可以实现对不同区域做出不同的响应。 默认的情况下,文本控件是...
  • QScintilla库和Cython中提供的一些词法分析器来更有效地突出显示文本。 我在开发时就考虑到了使用的简便性和可扩展性。 对于Windows的预编译包,请参见发行页面()。 网站: 快速功能视频: 执照: GNU通用公共许可...
  • 使用wxPython GUI工具包编写的,针对Python程序员的跨平台文本编辑器(Windows,Linux,MacOS)! 发展 这是我的最新项目,我将在接下来的几个月中继续研究! :hourglass_not_done: 敬请关注我的PyElite的第一个...
  • 我们编写的大多数程序都将直接在【文本编辑器】中运行。但有时候,从终端运行程序很有用。 例如:我们想直接运行既有的程序。 在Linux和OS X系统中从终端运行Python程序: 在OS X系统中如果想在终端会话中,直接运行...
  • 捕鱼java源码下载我的 Meadville 文本分析项目 这是 MyMeadville ...您将看到一个弹出窗口,您可以选择要安装的软件包。 如果你有足够的存储空间,你可以选择所有的包。q : pip3 install -U scikit-learn
  • 基于Python-Tcl的文本编辑器,具有丰富的编辑器功能和多个选项卡支持。 屏幕截图 格式: 特征 自动关键字突出显示。 自动检测源代码实现的语言。 支持多种主题和选项以保存您的默认设置。 多选项卡支持可同时...
  • wxPython 工具包提供了多种不同的窗口部件,包括了本章所提到的基本控件。我们涉及静态文本、可编辑的文本、按钮、微调、滑块、...这一节以在屏幕上显示文本的例子作为开始,包括用作标签的静态文本域,有样式和无样式

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 284
精华内容 113
关键字:

python窗口显示文本

python 订阅