wxPython in Action(五十)

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)相反——指定行和列,返回整数值位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值