wxpython基本控件之按钮控件的用法

发布时间:2020-06-04编辑:脚本学堂
本文介绍了wxpython基本控件中按钮控件的用法,重点讨论文本按钮、位图按钮、开关按钮(toggle buttons )和通用(generic )按钮的用法。

 
如何创建一个复选框?
 
复选框是一个带有文本标签的开关按钮。复选框通常成组的方式显示,但是每个复选框的开关状态是相互独立的。当你有一个或多个需要明确的开关状态的选项时,可以使用复选框。图7.10显示了一组复选框。
 
在wxPython 中复选框很容易使用。它们是wx.checkbox 类的实例,并且通过把它们一起放入一个父容器中可以让它们在一起显示。例7.10提供了生成图7.10的代码。
 
例7.10 插入三个复选框到一个框架中
 

复制代码 代码示例:

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 构造函数:
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 对象的列子。
 
在这个例子中使用wx.RadioButton 的原因是因为每个单选按钮控制着一个关联的文本控件。由于窗口部件是位于这组单选按钮之外的,所以我们不能只用一个单选按钮框。
 
如何创建单选按钮
 
例7.11显示了图7.11的代码,它管理单选按钮和文本控件之间的联系。
 
例7.11 使用wx.RadioButton 来控制另一个窗口部件
 

复制代码 代码示例:
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 。它们的构造函数几乎是相同的,如下所示:
 
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所示,它看起来非常类似一组单选按钮。
 
要使用wx.RadioBox 类,你所需要的全部就是构造函数。例7.12显示了图7.12的代码。
 
例7.12 建造单选框
 

复制代码 代码示例:
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 的构造函数比简单的单选按钮更复杂,因为你需要去一下子为所有的按钮指定数据,如下所示:
 

复制代码 代码示例:
 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列出了这些方法。
 
表7.11 wx.RadioBox 的方法
EnableItem(n , flag) :flag 参数是一个布尔值,它用于使索引为n的按钮有效或无效。要使整个框立即有效,使用Enable() 。
FindString(string) :根据给定的标签返回相关按钮的整数索引值,如果标签没有发现则返回-1。
GetCount() :返回框中按钮的数量。
GetItemLabel(n) SetItemLabel(n , string) :返回或设置索引为n的按钮的字符串标签。
GetSelection() GetStringSelection() SetSelection(n) SetStringSelection( string) :GetSelection() 和 SetSelection() 方法处理当前所选择的单选按钮的整数索引。GetStringSelection() 返回当前所选择的按钮的字符串标签,SetStringSelection() 改变所选择的按钮的字符串标签为给定值。没有set *()产生EVT_RADIOBOX 事件。
ShowItem(item , show) :show 参数是一个布尔值,用于显示或隐藏索引为item 的按钮。
 
单选按钮不是给用户一系列选择的唯一方法。列表框和组合框占用的空间也少,也可以被配置来让用户从同一组中作多个选择。
 
如何创建一个列表框?
 
列 表框是提供给用户选择的另一机制。选项被放置在一个矩形的窗口中,用户可以选择一个或多个。列表框比单选按钮占据较少的空间,当选项的数目相对少的时候, 列表框是一个好的选择。然而,如果用户必须将滚动条拉很远才能看到所有的选项的话,那么它的效用就有所下降了。图7.13显示了一个wxPython 列表框。
 
在wxPython 中,列表框是类wx.ListBox 的元素。该类的方法使你能够处理列表中的选择。
 
如何创建一个列表框
 
例7.13显示了产生图7.13的代码
 
例7.13 使用wx.ListBox
 

复制代码 代码示例:
import wx 
 
class ListBoxFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, -1, 'List Box Example',  
                size=(250, 200)) 
        panel = wx.Panel(self, -1) 
 
        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five', 
                      'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 
                      'twelve', 'thirteen', 'fourteen'] 
 
        listBox = wx.ListBox(panel, -1, (20, 20), (80, 120), sampleList,  
                wx.LB_SINGLE) 
        listBox.SetSelection(3) 
                 
if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    ListBoxFrame().Show() 
    app.MainLoop()   
 

 
wx.ListBox 的构造函数类似于单选框的,如下所示:
wx.ListBox(parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize, choices=None, style=0, validator=wx.DefaultValidator, name="listBox")  
 
单选框和列表框的主要区别是wx.ListBox 没有label 属性。显示在列表中的元素放置在参数choices 中,它是一个字符串的序列。列表框有三种互斥的样式,它决定用户如何从列表框中选择元素,说明在表7.12中。
 
用户通常对于多选有一些问题,因为它们一般希望见到的是单选列表,对于多选来说可能是有挑战性的(就像单选题和多选题一样),尤其是对于那些易受困扰的用户。如果你使用了一个多选的列表,我们建议你清楚地标明该列表。
 
表7.12 列表框的选择类型样式
 
wx.LB_EXTENDED :用户可以通过使用shift 并敲击鼠标来选择一定范围内的连续的选项,或使用等同功能的按键。
wx.LB_MULTIPLE :用户可以一次选择多个选项(选项可以是不连续的)。实际上,在这种情况下,列表框的行为就像是一组复选框。
 
wx.LB_SINGLE :用户一次只能选一个选项。实际上,在这种情况下,列表框的行为就像是一组单选按钮。
 
有三种控制wx.ListBox 中滚动条的显示的样式,如表7.13所示。
 
表7.13 列表框的滚动条类型样式
wx.LB_ALWAYS_SB :列表框将始终显示一个垂直的滚动条,不管有没有必要。
wx.LB_HSCROLL :如果本地控支持,那么列表框在选择项太多时,将创建一个水平滚动条。
wx.LB_HSCROLL :列表框只在需要的时候显示一个垂直的滚动条。这是默认样式。
 
还有一个样式wx.LB_SORT ,它使得列表中的元素按字母顺序排序。
 
有两个专用于wx.ListBox 的命令事件。EVT_LISTBOX 事件在当列表中的一个元素被选择时触发(即使它是当前所选择的元素)。如果列表被双击,EVT_LISTBOX_DCLICK 事件发生。
 
有一些专用于列表框的方法,你可以用来处理框中的项目。表7.14对许多的方法作了说明。列表框中的项目索引从0开始。
一旦你有了一个列表框,自然就想把它与其它的窗口部件结合起来使用,如下拉菜单,或复选框。在下一节,我们对此作讨论。
 
表7.14 列表框的方法
Append(item) :把字符串项目添加到列表框的尾部。
Clear() :清空列表框。
Delete(n) :删除列表框中索引为n的项目。
Deselect(n) :在多重选择列表框中,导致位于位置n的选项取消选中。在其它样式中不起作用。
FindString(string) :返回给定字符串的整数位置,如果没有发现则返回-1。
GetCount() :返回列表中字符串的数量。
GetSelection() SetSelection(n , select) GetStringSelection() SetStringSelection(string , select) GetSelections() :GetSelection() 得到当前选择项的整数索引(仅对于单选列表)。对于多选列表,使用GetSelections() 来返回包含所选项目的整数位置的元组。对于单选列表,GetStringSelection() 返回当前选择的字符串。相应的set 方法使用布尔值参数select 设置指定字符串或索引选项的状态。使用这种方法改变选择不触发EVT_LISTBOX 事件。
GetString(n) SetString(n , string) :得到或设置位置n处的字符串。
InsertItems(items , pos) :插入参数items 中的字符串列表到该列表框中pos 参数所指定的位置前。位置0表示把项目放在列表的开头。
Selected(n) :返回对应于索引为n的项目的选择状态的布尔值。
Set(choices) :重新使用 choices 的内容设置列表框。
 
如何合并复选框和列表框?
 
你可以使用类wx.CheckListBox 来将复选框与列表框合并。图7.14显示了列表框和复选框在合并在一起的例子。
wx.CheckListBox 的构造函数和大多数方法与wx.ListBox 的相同。它有一个新的事件:wx.EVT_CHECKLISTBOX ,它在当列表中的一个复选框被敲击时触发。它有两个管理复选框的新的方法:Check(n , check) 设置索引为n的项目的选择状态,IsChecked(item) 在给定的索引的项目是选中状态时返回True 。
 
如果我想要下拉形式的选择该怎么做?
 
下拉式选择是一种仅当下拉箭头被敲击时才显示选项的选择机制。它是显示所选元素的最简洁的方法,当屏幕空间很有限的时候,它是最有用的。图7.15显示了一个关闭的下拉式选择。图7.16显示了一个打开的下拉式选择。
 
下拉式选择的使用与标准的列表框是很相似的。例7.14显示了如何创建一个下拉式选择。
 
例7.14
 

复制代码 代码示例:
import wx 
 
class ChoiceFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, -1, 'Choice Example',  
                size=(250, 200)) 
        panel = wx.Panel(self, -1) 
        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five', 
                      'six', 'seven', 'eight'] 
        wx.StaticText(panel, -1, "Select one:", (15, 20)) 
        wx.Choice(panel, -1, (85, 18), choices=sampleList) 
 
if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    ChoiceFrame().Show() 
    app.MainLoop()  
 

 
wx.Choice 的构造函数与列表框的基本相同:
 
wx.Choice(parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize, choices=None, style=0, validator=wx.DefaultValidator, name="choice")  
 
wx.Choice 没有专门的样式,但是它有独特的命令事件:EVT_CHOICE 。几乎表7.14中所有适用于单选列表框的方法都适用于wx.Choice 对象。
 
我能够将文本域与列表合并在一起吗?
 
将文本域与列表合并在一起的窗口部件称为组合框,其本质上是一个下拉选择和文本框的组合。图7.17显示了一个组合框。
 
图7.17 左边是wx.CB_DropDOWN 样式,右边是wx.CB_SIMPLE 样式
 
在Windows 上,你可以使用右边的样式,它是一个列表框和文本框的组合。
创建组合框的代码与我们已经见过的选择是类似的。该类是wx.ComboBox ,它是wx.Choice 的一个子类。例7.15显示了图7.17的代码:
 
例7.15
 

复制代码 代码示例:
import wx 
 
class ComboBoxFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, -1, 'Combo Box Example',  
                size=(350, 300)) 
        panel = wx.Panel(self, -1) 
        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five', 
                      'six', 'seven', 'eight'] 
        wx.StaticText(panel, -1, "Select one:", (15, 15)) 
        wx.ComboBox(panel, -1, "default value", (15, 30), wx.DefaultSize, 
                    sampleList, wx.CB_DropDOWN) 
        wx.ComboBox(panel, -1, "default value", (150, 30), wx.DefaultSize, 
                        sampleList, wx.CB_SIMPLE) 
                         
if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    ComboBoxFrame().Show() 
    app.MainLoop()         
 

 
wx.ComboBox 的构造函数如下所示:
 

wx.ComboBox(parent, id, value="", pos=wx.DefaultPosition, 
        size=wx.DefaultSize, choices, style=0, 
        validator=wx.DefaultValidator, name="comboBox") 


 
对于wx.ComboBox 来说有4种样式。其中的两种决定了如何绘制组合框:wx.CB_DropDOWN 创建一个带有下拉列表的组合框,wx.CB_SIMPLE 创建一个带有列表框的组合框。在Windows 上你可以只使用wx.CB_SIMPLE 样式。任何组合框都可以被指定为wx.CB_readonly 样式,它防止用户在文本域中键入。当组合框被指定为只读时,所做的选择必须来自于选择列表的元素之一,即使你用程序来设置它也不行。最后wx.CB_SORT 样式导致选择列表中的元素按字母顺序显示。
 
由于wx.ComboBox 是wx.Choice 的子类,所有的wx.Choice 的方法都能被组合框调用,如表7.14所示。另外,还有许多方法被定义来处理文本组件,它们的行为同wx.TextCtrl (参见表7.4),所定义的方法有Copy() , Cut() , GetInsertionPoint() , GetValue() , Paste() , Replace(from ,to , text) , Remove(from , to) , SetInsertionPoint(pos) , SetInsertionPointEnd() ,和 SetValue() 。