7.1.4 如何创建一个多行或样式文本控件?
你可以使用wx.TE_MULTILINE样式标记创建一个多行文本控件。如果本地窗口控件支持样式,那么你可以改变被控件管理的文本的字体和颜色样式,这有时被称为丰富格式文本。对于另外的一些平台,设置样式的调用被忽视掉了。图7.3显示了多行文本控件的一个例子。
例7.3包含了用于创建图7.3的代码。通常,创建一个多行文本控件是通过设置wx.TE_MULTILINE样式标记来处理的。较后的部分,我们将讨论使用丰富文本样式。
例7.3 创建一个多行文本控件
import wx
class TextFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Text Entry Example',
size=(300, 250))
panel = wx.Panel(self, -1)
multiLabel = wx.StaticText(panel, -1, "Multi-line")
multiText = wx.TextCtrl(panel, -1,
"Here is a looooooooooooooong line of text set in the control./n/n"
"See that it wrapped, and that this line is after a blank",
size=(200, 100), style=wx.TE_MULTILINE) #创建一个文本控件
multiText.SetInsertionPoint(0) #设置插入点
richLabel = wx.StaticText(panel, -1, "Rich Text")
richText = wx.TextCtrl(panel, -1,
"If supported by the native control, this is reversed, and this is a different font.",
size=(200, 100), style=wx.TE_MULTILINE|wx.TE_RICH2) #创建丰富文本控件
richText.SetInsertionPoint(0)
richText.SetStyle(44, 52, wx.TextAttr("white", "black")) #设置文本样式
points = richText.GetFont().GetPointSize()
f = wx.Font(points + 3, wx.ROMAN, wx.ITALIC, wx.BOLD, True) #创建一个字体
richText.SetStyle(68, 82, wx.TextAttr("blue", wx.NullColour, f)) #用新字体设置样式
sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)
sizer.AddMany([multiLabel, multiText, richLabel, richText])
panel.SetSizer(sizer)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = TextFrame()
frame.Show()
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.TE_MULTILINE样式标记创建一个多行文本控件。如果本地窗口控件支持样式,那么你可以改变被控件管理的文本的字体和颜色样式,这有时被称为丰富格式文本。对于另外的一些平台,设置样式的调用被忽视掉了。图7.3显示了多行文本控件的一个例子。
例7.3包含了用于创建图7.3的代码。通常,创建一个多行文本控件是通过设置wx.TE_MULTILINE样式标记来处理的。较后的部分,我们将讨论使用丰富文本样式。
例7.3 创建一个多行文本控件
import wx
class TextFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Text Entry Example',
size=(300, 250))
panel = wx.Panel(self, -1)
multiLabel = wx.StaticText(panel, -1, "Multi-line")
multiText = wx.TextCtrl(panel, -1,
"Here is a looooooooooooooong line of text set in the control./n/n"
"See that it wrapped, and that this line is after a blank",
size=(200, 100), style=wx.TE_MULTILINE) #创建一个文本控件
multiText.SetInsertionPoint(0) #设置插入点
richLabel = wx.StaticText(panel, -1, "Rich Text")
richText = wx.TextCtrl(panel, -1,
"If supported by the native control, this is reversed, and this is a different font.",
size=(200, 100), style=wx.TE_MULTILINE|wx.TE_RICH2) #创建丰富文本控件
richText.SetInsertionPoint(0)
richText.SetStyle(44, 52, wx.TextAttr("white", "black")) #设置文本样式
points = richText.GetFont().GetPointSize()
f = wx.Font(points + 3, wx.ROMAN, wx.ITALIC, wx.BOLD, True) #创建一个字体
richText.SetStyle(68, 82, wx.TextAttr("blue", wx.NullColour, f)) #用新字体设置样式
sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)
sizer.AddMany([multiLabel, multiText, richLabel, richText])
panel.SetSizer(sizer)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = TextFrame()
frame.Show()
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)相反——指定行和列,返回整数值位置。
如果你能在系统中使用任意字体的话,那么就可以更加灵活的创建样式。
接下来,我们将给你展示如何创建和使用字体实例。