例7.9显示了产生图7.9的代码。与本章中许多别的例子不同的是,这里我们增加了一个事件处理器。下面的代码在空闭时调整标尺的值,使得值周而复始的变化。
例7.9 显示并更新一个wx.Gauge
Python代码
- import wx
-
- class GaugeFrame(wx.Frame):
- def __init__(self):
- wx.Frame.__init__(self, None, -1, 'Gauge Example',
- size=(350, 150))
- panel = wx.Panel(self, -1)
- self.count = 0
- self.gauge = wx.Gauge(panel, -1, 50, (20, 50), (250, 25))
- self.gauge.SetBezelFace(3)
- self.gauge.SetShadowWidth(3)
- self.Bind(wx.EVT_IDLE, self.OnIdle)
-
- def OnIdle(self, event):
- self.count = self.count + 1
- if self.count == 50:
- self.count = 0
- self.gauge.SetValue(self.count)
-
- if __name__ == '__main__':
- app = wx.PySimpleApp()
- GaugeFrame().Show()
- app.MainLoop()
wx.Gauge 的构造函数类似于其它的数字的窗口部件:
Python代码
- wx.Gauge(parent, id, range, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.GA_HORIZONTAL, validator=wx.DefaultValidator, name="gauge")
当你使用参数range 来指定数字值时,该值代表标尺的上限,而下限总是0。默认样式wx.GA_HORIZONTAL 提供了一个水平条。要将它旋转90度,使用wx.GA_VERTICAL 样式。如果你是在Windows 上,那么样式wx.GA_PROGRESSBAR 给你的是来自Windows 工具包的本地化的进度条。
作为一个只读控件,wx.Gauge 没有事件。然而,它的属性你可以设置。你可以使用GetValue() , Set -Value(pos) ,GetRange() , 和 SetRange(range) 来调整它的值和范围。如果你是在Windows 上,并且没有使用本地进度条样式,那么你可以使用SetBezelFace(width) and SetShadowWidth() 来改变3D效果的宽度。
给用户以选择
几乎每个应用程序都要求用户在一套预先定义的选项间进行选择。在wxPython 中,有多种窗口部件帮助用户处理这种任务,包括复选框、单选按钮、列表框和组合框。接下来的部分将介绍这些窗口部件。
如何创建一个复选框?
复选框是一个带有文本标签的开关按钮。复选框通常成组的方式显示,但是每个复选框的开关状态是相互独立的。当你有一个或多个需要明确的开关状态的选项时,可以使用复选框。图7.10显示了一组复选框。
图7.10
在wxPython 中复选框很容易使用。它们是wx.CheckBox 类的实例,并且通过把它们一起放入一个父容器中可以让它们在一起显示。例7.10提供了生成图7.10的代码。
例7.10 插入三个复选框到一个框架中
Python代码
- import wx
-
- class CheckBoxFrame(wx.Frame):
- def __init__(self):
- wx.Frame.__init__(self, None, -1, 'Checkbox Example',
- size=(150, 200))
- panel = wx.Panel(self, -1)
- wx.CheckBox(panel, -1, "Alpha", (35, 40), (150, 20))
- wx.CheckBox(panel, -1, "Beta", (35, 60), (150, 20))
- wx.CheckBox(panel, -1, "Gamma", (35, 80), (150, 20))
-
- if __name__ == '__main__':
- app = wx.PySimpleApp()
- CheckBoxFrame().Show()
- app.MainLoop()
wx.CheckBox 有一个典型的wxPython 构造函数:
Python代码
- wx.CheckBox(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="checkBox")
label 参数是复选框的标签文本。复选框没有样式标记,但是它们产生属于自己的独一无二的命令事件:EVT_CHECKBOX 。wx.CheckBox 的开关状态可以使用GetValue() 和SetValue(state) 方法来访问,并且其值是一个布尔值。IsChecked() 方法等同于GetValue() 方法,只是为了让代码看起来更易明白。
如何创建一组单选按钮(radio button )?单选按钮是一种允许用户从几个选项中选择其一的窗口部件。与复选框不同,单选按钮是显式地成组配置,并且只能选择其中一个选项。当选择了新的选项时,上次的选择就关闭了。单选按钮的使用比复选框复杂些,因为它需要被组织到一组中以便使用。radio button 的名字得自于老式轿车上有着同样行为的成组的选择按钮。
在wxPython 中,有两种方法可以创建一组单选按钮。其一,wx.RadioButton ,它要求你一次创建一个按钮,而wx.RadioBox 使你可以使用单一对象来配置完整的一组按钮,这些按钮显示在一个矩形中。
wx.RadioButton 类更简单些,在单选按钮对其它窗口部件有直接影响或单选按钮不是布置在一个单一的矩形中的情况下,它是首选。图7.11显示了一组wx.RadioButton 对象的列子。
图7.11
我们在这个例子中使用wx.RadioButton 的原因是因为每个单选按钮控制着一个关联的文本控件。由于窗口部件是位于这组单选按钮之外的,所以我们不能只用一个单选按钮框。
如何创建单选按钮
例7.11显示了图7.11的代码,它管理单选按钮和文本控件之间的联系。
例7.11 使用wx.RadioButton 来控制另一个窗口部件
Python代码
- import wx
-
- class RadioButtonFrame(wx.Frame):
- def __init__(self):
- wx.Frame.__init__(self, None, -1, 'Radio Example',
- size=(200, 200))
- panel = wx.Panel(self, -1)
-
- #创建单选按钮
- radio1 = wx.RadioButton(panel, -1, "Elmo", pos=(20, 50), style=wx.RB_GROUP)
- radio2 = wx.RadioButton(panel, -1, "Ernie", pos=(20, 80))
- radio3 = wx.RadioButton(panel, -1, "Bert", pos=(20, 110))
-
- #创建文本控件
- text1 = wx.TextCtrl(panel, -1, "", pos=(80, 50))
- text2 = wx.TextCtrl(panel, -1, "", pos=(80, 80))
- text3 = wx.TextCtrl(panel, -1, "", pos=(80, 110))
- self.texts = {"Elmo": text1, "Ernie": text2, "Bert": text3}#连接按钮和文本
- for eachText in [text2, text3]:
- eachText.Enable(False)
- for eachRadio in [radio1, radio2, radio3]:#绑定事件
- self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)
- self.selectedText = text1
-
- def OnRadio(self, event):#事件处理器
- if self.selectedText:
- self.selectedText.Enable(False)
- radioSelected = event.GetEventObject()
- text = self.texts[radioSelected.GetLabel()]
- text.Enable(True)
- self.selectedText = text
-
- if __name__ == '__main__':
- app = wx.PySimpleApp()
- RadioButtonFrame().Show()
- app.MainLoop()
我们创建了单选按钮和文本框,然后使用字典来建立它们间的连接。一个for 循环使得两个文本框无效,另一个for 循环绑定单选按钮命令事件。当事件发生的时候,当前活动的文本框变为无效,与被敲击的按钮相匹配的文本框变为有效。 wx.RadioButton 的使用类似于是wx.CheckBox 。它们的构造函数几乎是相同的,如下所示:
Python代码
- wx.RadioButton(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name="radioButton")
在复选框中,label 是相应按钮的显示标签。
wx.RB_GROUP 样式声明该按钮位于一组单选按钮开头。一组单选按钮的定义是很重要的,因为它控制开关行为。当组中的一个按钮被选中时,先前被选中的按钮被切换到未选中状态。在一个单选按钮使用wx.RB_GROUP 被创建后,所有后来的被添加到相同父窗口部件中的单选按钮都被添加到同一组,直到另一单选按钮使用wx.RB_GROUP 被创建,并开始下一个组。在例7.11中,第一个单选按钮是使用wx.RB_GROUP 声明的,而后来的没有。结果导致所有的按钮都被认为在同一组中,这样一来,敲击它们中的一个时,先前被选中按钮将关闭。
使用单选框
通常,如果你想去显示一组按钮,分别声明它们不是最好的方法。取而代之,wxPython 使用wx.RadioBox 类让你能够创建一个单一的对象,该对象包含了完整的组。如图7.12所示,它看起来非常类似一组单选按钮。
图7.12
要使用wx.RadioBox 类,你所需要的全部就是构造函数。例7.12显示了图7.12的代码。
例7.12 建造单选框
Python代码
- import wx
-
- class RadioBoxFrame(wx.Frame):
- def __init__(self):
- wx.Frame.__init__(self, None, -1, 'Radio Box Example',
- size=(350, 200))
- panel = wx.Panel(self, -1)
- sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
- 'six', 'seven', 'eight']
- wx.RadioBox(panel, -1, "A Radio Box", (10, 10), wx.DefaultSize,
- sampleList, 2, wx.RA_SPECIFY_COLS)
-
- wx.RadioBox(panel, -1, "", (150, 10), wx.DefaultSize,
- sampleList, 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER)
-
- if __name__ == '__main__':
- app = wx.PySimpleApp()
- RadioBoxFrame().Show()
- app.MainLoop()
wx.RadioBox 的构造函数比简单的单选按钮更复杂,因为你需要去一下子为所有的按钮指定数据,如下所示:
Python代码
- wx.RadioBox(parent, id, label, pos=wx.DefaultPosition,
- size=wxDefaultSize, choices=None, majorDimension=0,
- style=wx.RA_SPECIFY_COLS, validator=wx.DefaultValidator,
- name="radioBox")
label 参数是静态文本,它显示在单选框的边框上。这些按钮使用choices 参数指定,它是一个Python 的字符串标签的序列。
如同网格的sizer 一样,你通过使用规定一个维数的尺寸来指定wx.RadioBox 的尺度,wxPython 在另一维度上自动填充。维度的主尺寸使用majorDimension 参数指定。哪一维是主要的由样式标记决定。默认值是wx.RA_SPECIFY_COLS 。在本例中,左框的列数被设置为2,右框的列数被设置为3,行数由choices 列表中的元素数量动态的决定。如果你想得到相反的行为,你要将样式设置为wx.RA_SPECIFY_ROWS 。如果你想在单选框被敲击时响应命令事件,那么这个命令事件是EVT_RADIOBOX 。
wx.RadioBox 类有许多方法来管理框中的不同的单选按钮。这些方法使你能够处理一个特定的内部按钮,传递该按钮的索引。索引以0为开始,并按严格的顺序展开,它的顺序就是按钮标签传递给构造函数的顺序。表7.11列出了这些方法。
|