wxPython in Action(三十九)

6.2 添加窗口装饰

尽管绘制到屏幕是一个画图程序不可或缺的部分,但是它距美观的程序还差的远。在这一节,我们将谈及常用的窗口装饰:状态栏、菜单和工具栏。我们将在第10章对这些做更详细的讨论。

6.2.1 如何添加和更新一个状态栏

在wxPython 中,你可以通过调用框架的CreateStatusBar()方法添加并放置一个状态栏到一个框架的底部。当父框架调整大小的时候,状态栏自动的自我调整 大小。默认情况下,状态栏是类wx.StatusBar的一个实例。要创建一个自定义的状态栏,要使用SetStatusBar()方法并要求你的新类的 实例作为参数来将状态栏附着到你的框架上。

要在你的状态栏上显示单一的一段文本,你可以使用wx.StatusBar的SetStatusText()方法。例6.2扩展了在例6.1中所演示的SketchFrame类来在状态栏中显示当前鼠标的位置。

例6.2 给框架添加一个简单的状态栏

import wx
from example1 import SketchWindow


class SketchFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Sketch Frame",
                size=(800,600))
        self.sketch = SketchWindow(self, -1)
        self.sketch.Bind(wx.EVT_MOTION, self.OnSketchMotion)
        self.statusbar = self.CreateStatusBar()

    def OnSketchMotion(self, event):
        self.statusbar.SetStatusText(str(event.GetPositionTuple()))
        event.Skip()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = SketchFrame(None)
    frame.Show(True)
    app.MainLoop()

我们通过使框架捕捉勾画窗的wx.EVT_MOTION事件来在状态栏中显示鼠标位置。事件处理器使用由该事件提供的数据设置状态栏的文本。然后调用Skip()方法来保证另外的OnMotion()方法被调用,否则线条将不被绘制。

如 果你想在状态栏中显示多个文本元素,你可以在状态栏中创建多个文本域。要使用这个功能,你要调用SetFieldsCount()方法,其参数是域的数 量;默认情况下只有我们先前所见的那一个域。这之后使用先前的SetStatusText(),但是要使用第二个参数来指定此方法所应的域。域的编号从0 开始。如果你不指定一个域,那么默认为设置第0号域,这也说明了为什么我们没有指定域而先前的例子能工作。

默认情况下,每个域的宽度是相 同的。要调整文本域的尺寸,wxPython提供了SetStatusWidth()方法。该方法要求一个整数的Python列表作为参数,列表的长度必 须和状态栏中哉的数量一致。按列表中整数的顺序来计算对应域的宽度。如果整数是正值,那么宽度是固定的。如果你想域的宽度随框架的变化而变化,那么应该使 用负值。负值的绝对值代表域的相对宽度;可以把它认为是所占总宽度的比例。例如调用statusbar.SetStatusWidth([-1, -2, -3])方法所导致的各域从左到右的宽度比例是1:2:3。图6.2显示了这个结果。

图6.2


例子6.3增加了两个状态域,其中一个显示所绘的当前线条的点数,另一个显示当前所画的线条的数量。该例所产生的状态条如图6.2所示。

例6.3 支持多个状态域

import wx
from example1 import SketchWindow

class SketchFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Sketch Frame",
                size=(800,600))
        self.sketch = SketchWindow(self, -1)
        self.sketch.Bind(wx.EVT_MOTION, self.OnSketchMotion)
        self.statusbar = self.CreateStatusBar()
        self.statusbar.SetFieldsCount(3)
        self.statusbar.SetStatusWidths([-1, -2, -3])

    def OnSketchMotion(self, event):
        self.statusbar.SetStatusText("Pos: %s" %
                str(event.GetPositionTuple()), 0)
        self.statusbar.SetStatusText("Current Pts: %s" %
                len(self.sketch.curLine), 1)
        self.statusbar.SetStatusText("Line Count: %s" %
                len(self.sketch.lines), 2)
        event.Skip()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = SketchFrame(None)
    frame.Show(True)
    app.MainLoop()


StatusBar类使你能够把状态域当作一个后进先出的堆栈。尽管本章的演示程序没有这样用,PushStatus-
Text()和PopStatusText()使得你能够在临时显示新的文本之后返回先前的状态文本。这两个方法都有一个可选的域号参数,以便在多个状态域的情况下使用。

表6.3归纳了wx.StatusBar最常用的方法

表6.3 wx.StatusBar的方法

GetFieldsCount()
SetFieldsCount(count):
得到或设置状态栏中域的数量。

GetStatusText(field=0)
SetStatusText(text, field=0):
得到或设置指定域中的文本。0是默认值,代表最左端的域。

PopStatusText(field=0):弹出堆栈中的文本到指定域中,以改变域中的文本为弹出值。

PushStatusText(text, field=0):改变指定的域中的文本为给定的文本,并将改变前的文本压入堆栈的顶部。

SetStatusWidths(widths):指定各状态域的宽度。widths是一个整数的Python列表。

在第10章中,我们将对状态栏作更详细的说明。下面我们将讨论菜单。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值