文本控件wx.TextCtrl是用来显示和编辑文本的控件,它支持单行和多行的文本编辑。在某些平台上,支持给文本控件中的文本设置一些简单的格式和风格。
一、wx.TextCtrl简介
wx.TextCtrl文本格式
在多行文本的情况下, wx.TextCtrl总是将文本存储为以’\n’字符分隔成多行文本序列( 就是说即使在非Unix平台上也以Unix文本格式存储)。这样做的好处是允许用户代码忽略平台之间的差异,但同时也付出一定的代价是控件中的索引问题。例如由GetInsertionPoint或GetSelection返回的索引,不能用作GetValue返回的字符串的索引,因为对于使用“\\r\\n”作为分隔符的平台(如Windows),它们将略微偏离。反之,如果需要在上述函数的帮助下从控件中获得两个索引之间的一个子字符串,则应该使用GetRange,索引本身只能传递给其他方法,例如SetInsertionPoint或SetSelection。总之,在多行样式下,不要使用wx.TextCtrl返回的索引值来获取索引所包含的字符串,该索引值仅作为参数传递给其他的wx.TextCtrl方法。
对于单行文本的情况下,控件中的索引确实对应于值字符串中的位置。
wx.TextCtrl文本样式
在多行文本的情况下, wx.TextCtrl提供了为其中单个字符设置字体和颜色的功能(注:在Windows下TE_RICH样式下需要这样的文本样式支持)。使用这些样式的方法是,在插入文本之前先调用SetDefaultStyle方法,或者在之后调用SetStyle来更改控件的文本样式。在这两种情况下,如果样式没有指定某些属性(例如,如果只想设置文本颜色,不更改字体和文本背景),则将使用默认样式的值。如果没有默认样式,则使用文本控件本身的属性。
下面的代码演示了如何使用SetDefaultStyle来改变文本样式:
text.SetDefaultStyle(wx.TextAttr(wx.RED))
text.AppendText("Red text\n")
text.SetDefaultStyle(wx.TextAttr(wx.NullColour, wx.LIGHT_GREY))
text.AppendText("Red on grey text\n")
text.SetDefaultStyle(wx.TextAttr(wx.BLUE))
text.AppendText("Blue on grey text\n")
wx.TextCtrl窗口样式
- wx.TE_PROCESS_ENTER:控件将生成事件wx.EVT_TEXT_ENTER,该事件可以由程序处理。如果未指定这个样式,按Enter键要么由控件内部处理,要么用于激活对话框的默认按钮(如果有的话)。
- wx.TE_PROCESS_TAB:通常,TAB键用于键盘导航,在控制中按下它将焦点切换到下一个。设置这种样式后,如果没有对制表符进行其他处理(例如通过wx.EVT_CHAR事件处理程序),则将一个文本制表符插入控件中。
- wx.TE_MULTILINE:文本控件允许多行。如果未指定此样式,则不应在控件值中使用换行字符。
- wx.TE_PASSWORD:文本将以星号显示。
- wx.TE_READONLY:文本不可编辑。
- wx.TE_RICH:在MSW下使用富文本控件,这允许控件中有超过64KB的文本(这种样式仅适用于Windows)。
- wx.TE_RICH2:在MSW下使用富文本控制2.0或更高版本(这种样式仅适用于Windows)。
- wx.TE_AUTO_URL:突出显示url并在鼠标事件发生时生成TextUrlEvents。
- wx.TE_NOHIDESEL:默认情况下,文本控件在没有焦点时不显示所选内容,使用这个样式强制它始终显示它(这种样式仅适用于Windows)。
- wx.HSCROLL:将创建并使用水平滚动条,这样文本就不会被换行。
- wx.TE_NO_VSCROLL:仅用于多行控件,永远不会创建垂直滚动条。
- wx.TE_LEFT:控件中的文本将左对齐(默认值)。
- wx.TE_CENTRE:控件中的文本将居中。
- wx.TE_RIGHT:控件中的文本将右对齐。
- wx.TE_DONTWRAP:和wx.HSCROLL一样,文本不换行,显示水平滚动条来代替换行。
- wx.TE_CHARWRAP:仅适用于多行控件,如果文本太长,则在可能的位置进行字符回绕。
- wx.TE_WORDWRAP:仅适用于多行控件,如果文本太长,则在可能的位置进行单词回绕。
- TE_CAPITALIZE:仅对于多行控件,在单词边界处换行,如果单词比窗口宽度长,则在任何其他字符处换行(这是默认值)。
wx.TextCtrl发出的事件
- EVT_TEXT:响应一个wx.EVT_TEXT事件,当文本发生变化时生成。注意,当文本控件的内容发生变化时,这个事件将被发送。
- EVT_TEXT_ENTER:响应wx.EVT_TEXT_ENTER事件, 当文本控件设置了wx. TE_PROCESS_ENTER样式时,在文本控件中按下enter键时生成该事件
- EVT_TEXT_URL:鼠标事件发生在文本控件中的URL上时生成此事件。
- EVT_TEXT_MAXLEN:当用户试图在控件中输入比wx.TextCtrl.SetMaxLength设置的限制更多的文本时,将生成此事件。
wx.TextCtrl常用方法
文本控件wx.TextCtrl的许多方法都在类wx.TextEntry中(关于wx.TextEntry, 请参考前文” 基本控件之下拉列表框ComboBox”。
- DiscardEdits(self):重置内部修改标志,就像保存了当前更改一样。
- EmptyUndoBuffer(self):删除undo历史记录(仅适用部分平台)。
- EmulateKeyPress(self, event):本方法在文本控件中发生给定键事件时将插入的字符插入到控件中。
- GetDefaultStyle(self):返回新文本当前使用的样式。
- GetLineLength(self, lineNo):获取指定行的长度,不包括任何尾随换行符。
- GetLineText(self, lineNo):返回文本控件中给定行的内容,不包括任何尾随换行符。
- GetNumberOfLines(self):返回文本控件缓冲区中的行数。
- GetStyle(self, position, style):返回文本控件中指定位置的样式(仅适用部分平台)。
- HideNativeCaret(self):隐藏小部件的本机插入符号(仅适用Windows)。
- HitTestPos(self, pt):查找字符在指定点上的位置。
- HitTest(self, pt):查找字符在指定点的行和列。
- IsModified(self):如果文本已被用户修改,则返回True。
- IsMultiLine(self):如果是多行编辑控件则返回True,否则返回False。
- IsSingleLine(self):如果是单行编辑控件则返回True,否则返回False。
- LoadFile(self, filename, fileType=TEXT_TYPE_ANY):加载并显示文件(如果它存在)。
- MarkDirty(self):将文本标记为已修改(dirty)。
- PositionToCoords(self, pos):将给定的文本位置转换为以像素为单位的客户端坐标。本方法允许查找在文本控件中显示的给定位置上的字符的位置。
- PositionToXY(self, pos):将给定位置转换为从零开始的列、行号对。
- SaveFile(self, filename="", fileType=TEXT_TYPE_ANY):将控件的内容保存在文本文件中。
- SetDefaultStyle(self, style):更改将添加到控件的新文本所使用的默认样式。
- SetModified(self, modified):标记控件内容是否已被用户修改。
- SetStyle(self, start, end, style):更改给定范围的样式。如果没有设置style中的任何属性,则使用GetDefaultStyle中的相应属性。
- ShowNativeCaret(self, show=True):显示小部件的本机插入符号(仅适用Windows)。
- ShowPosition(self, pos): 使包含给定位置的行可见。
- XYToPosition(self, x, y):将给定的从零开始的列号和行号转换为一个位置。
- flush(self):file-like兼容。
- write(self, text):将文本添加到TextCtrl控件中,file-like兼容。
图1:wx.TextCtrl类继承关系
二、wx.TextCtrl演示
下面的代码演示如何使用wx.TextCtrl。
#文本编辑框(wx.TextCtrl)
import wx
class SampleTextCtrl(wx.Frame):
def __init__(self, *args, **kw):
super(SampleTextCtrl, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: TextCtrl演示")
#设置窗口尺寸
self.SetSize(480, 320)
panel = wx.Panel(self)
#单行文本
wx.StaticText(panel, label = "单行文本:", pos = (20, 10))
self.txtSingle = wx.TextCtrl(panel, wx.ID_ANY, pos = (100, 10), size = (260, 24))
#多行文本
wx.StaticText(panel, label = "多行文本:", pos = (20, 50))
self.txtMulti = wx.TextCtrl(panel, wx.ID_ANY, pos = (100, 50), size = (260, 100), style = wx.TE_MULTILINE)
#富文本
wx.StaticText(panel, label = "富文本:", pos = (20, 160))
self.txtRich = wx.TextCtrl(panel, wx.ID_ANY, pos = (100, 160), size = (260, 100), style = wx.TE_RICH | wx.TE_MULTILINE)
#添加文本按钮
btnAppend = wx.Button(panel, label="添加", pos = (380, 10))
btnAppend.Bind(wx.EVT_BUTTON, self.OnAppendText)
#清除文本按钮
btnClear = wx.Button(panel, label="清除", pos = (380, 236))
btnClear.Bind(wx.EVT_BUTTON, self.OnClearText)
self.Centre()
#将单行文本中输入的文字添加到多行和富文本编辑框中
def OnAppendText(self, e):
txt = self.txtSingle.GetValue()
if(len(txt) > 0):
self.txtMulti.AppendText(txt)
self.txtMulti.AppendText("\n")
self.txtRich.AppendText(txt)
self.txtRich.AppendText("\n")
def OnClearText(self, e):
self.txtSingle.Clear()
self.txtMulti.Clear()
self.txtRich.Clear()
def main():
app = wx.App()
sample = SampleTextCtrl(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
上述代码演示了如何创建单文本编辑框,多文本编辑框和富文本编辑框,然后可以在单文本框中输入文本,点击“添加”按钮,将输入的文本追加到多文本编辑框和富文本编辑框中。点击”清除”按钮将清除所有文本框中的文本。
图2:wx.TextCtrl演示
三、本文知识点
- 了解和使用wx.TextCtrl。
- 了解在不同平台wx.TextCtrl实现的功能有差异。