wxPython学习(6.控件)

1.静态文本和按钮

wxPython中静态文本类是wx.StaticText,可以显示文本。wxPython中的按钮主要有三个:wx.Button、wx.BitmapButton和wx.ToggleButton。
wx.Button:是普通按钮
wx.BitmapButton:是带有图标按钮
wx.ToggleButton:能进行两种状态切换的按钮

StaticText构造函数的参数
parent:父窗口部件。
id:标识符。使用-1可以自动创建一个唯一的标识。
label:你想显示在静态控件中的文本。
pos:一个wx.Point或一个Python元组,它是窗口部件的位置。
size:一个wx.Size或一个Python元组,它是窗口部件的尺寸。
style:样式标记。
name:对象的名字,用于查找的需要。

wx.StaticText的样式:
wx.ALIGN_CENTER:静态文本位于静态文本控件的中心。
wx.ALIGN_LEFT:文本在窗口部件中左对齐。这是默认的样式。
wx.ALIGN_RIGHT:文本在窗口部件中右对齐。
wx.ST_NO_AUTORESIZE:如果使用了这个样式,那么在使用了SetLabel()改变文本之后,静态文本控件不将自我调整尺寸。你应结合使用一个居中或右对齐的控件来保持对齐。

当创建了一个居中或右对齐的单行静态文本时,你应该显式地在构造器中设置控件的尺寸。指定尺寸以防止wxPython自动调整该控件的尺寸。wxPython的默认尺寸是刚好包容了文本的矩形尺寸,因此对齐就没有什么必要。要在程序中动态地改变窗口部件中的文本,而不改变该窗口部件的尺寸,就要设置wx.ST_NO_AUTORESIZE样式。这样就防止了在文本被重置后,窗口部件自动
调整尺寸到刚好包容了文本。如果静态文本是位于一个动态的布局中,那么改变它的尺寸可能导致屏幕上其它的窗口部件移动,这就对用户产生了干扰。


wx.Button的构造函数:
wx.Button(parent, id, label, pos, size=wxDefaultSize, style=0,validator, name=”button”)
参数label是显示在按钮上的文本。它可以在程序运行期间使用SetLabel()来改变,并且使用GetLabel()来获取。另外两个有用的方法是GetDefaultSize()和SetDefault()。GetDefaultSize()返回系统默认按钮的尺寸(对于框架间的一致性是有用的);SetDefault()设置按钮为对话框或框架的默认按钮。默认按钮的绘制不同于其它按钮,它在对话框获得焦点时,通常按下回车键被激活。

wx.Button在被敲击时触发一个命令事件,事件类型是EVT_BUTTON。


在wxPython中,使用类wx.BitmapButton来创建一个位图按钮。处理一个wx.BitmapButton的代码是与通用按钮的代码非常类似的
与普通按钮的主要的区别是你需要提供一个位图,而非一个标签。否则,构造器和大部分代码是与文本按钮的例子相同的。位图按钮在被敲击时同样产生EVT_BUTTON事件。

使用wx.ToggleButton创建一个开关按钮(toggle button)。开关按钮(toggle button)看起来十分像文本按钮,但它的行为更像复选框,它的选择或非选择状态是可视化的。换句话说,当你按下一个开关按钮(toggle button)时,它将一直保持被按下的状态直到你再次敲击它。

在wx.ToggleButton与父类wx.Button之间只有丙个区别:
1、当被敲击时,wx.ToggleButton发送一个EVT_TOGGLEBUTTON事件。
2、wx.ToggleButton有GetValue()和SetValue()方法,它们处理按钮的二进制状态。

考虑:
1.布局
2.事件处理有哪些

例:如图

 

#静态文本和按钮
import wx
#自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None,title="静态文本与按钮",size=(400,300))
        self.Centre()#设置窗口居中
        panel = wx.Panel(parent=self)
        
        #创建垂直方向布局box
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        #准备按钮
        #成员变量,水平居中对齐
        self.statictext = wx.StaticText(panel,label='statictext1',style=wx.ALIGN_CENTER_HORIZONTAL)
        #proportion=-1,不指定为-1,此时均匀分配
        b1= wx.Button(panel,-1,label='OK')
        self.Bind(wx.EVT_BUTTON,self.on_click,b1)
 
        b2= wx.ToggleButton(panel,-1,label='ToggleButton')
        self.Bind(wx.EVT_BUTTON,self.on_click,b2)
        #这里使用的是图片绝对路径,wx.BITMAP_TYPE_PNG为图片类型
        bmp= wx.Bitmap('C:/Users/Administrator/Desktop/err_small.png',wx.BITMAP_TYPE_PNG)
        b3= wx.BitmapButton(panel,-1,bmp)
        self.Bind(wx.EVT_BUTTON,self.on_click,b3)
        
        #开始布局,添加控件到box布局管理器
        vbox.Add(100,5,proportion=1,flag=wx.CENTER | wx.FIXED_MINSIZE)#添加一个空白空间
        vbox.Add(self.statictext,proportion=1,flag=wx.CENTER | wx.FIXED_MINSIZE)
        vbox.Add(b1,proportion=1,flag=wx.CENTER | wx.EXPAND)
        vbox.Add(b2,proportion=1,flag=wx.CENTER | wx.EXPAND)
        vbox.Add(b3,proportion=1,flag=wx.CENTER | wx.EXPAND)     
        panel.SetSizer(vbox)
        
    def on_click(self,event):
        self.statictext.SetLabelText('hello world')

#应用程序对象自定义,可以捕获应用程序生命周期
class App(wx.App):
    def OnInit(self):
        #创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True
    
    def OnExit(self):
        print('应用程序退出')
        return 0
    
#当前模块名是不是主模块,即应用程序的入口  
if __name__ == '__main__':
    app = App()#调用上面函数
    app.MainLoop()#进入主事件循环

补充:flag标志

 

2.文本输入控件

文本输入控件类是 wx.TextCtrl,默认情况下只能文本输入控件中只能输入单行数据,如果想输入多行可以设置 style=wx.TE_MULTILINE。如果想把文本输入控件作为密码框
使用,可以设置 style=wx.TE_PASSWORD

多行文本也叫文本区

wx.TextCtrl类的构造函数较小且比其父类wx.Window更精细,它增加了两个参数:
wx.TextCtrl(parent, id, value = ””, pos=wx.DefaultPosition,size=wx.DefaultSize, style=0, validator=wx.DefaultValidator,name=wx.TextCtrlNameStr)
参数parent, id, pos, size, style, 和 name与上面相同。
value是显示在该控件中的初始文本。
validator参数用于一个wx.Validator。validator通常用于过虑数据以确保只能键入要接受的数据。

wx.TextCtrl的样式
wx.TE_CENTER:控件中的文本居中。
wx.TE_LEFT:控件中的文本左对齐。默认行为。
wx.TE_NOHIDESEL:文本始终高亮显示,只适用于Windows。
wx.TE_PASSWORD:不显示所键入的文本,代替以星号显示。
wx.TE_PROCESS_ENTER:如果使用了这个样式,那么当用户在控件内按下回车键时,一个文本输入事件被触发。否则,按键事件内在的由该文本控件或该对话框管理。
wx.TE_PROCESS_TAB:如果指定了这个样式,那么通常的字符事件在Tab键按下时创建(一般意味一个制表符将被插入文本)。否则,tab由对话框来管理,通常是控件间的切换。
wx.TE_READONLY:文本控件为只读,用户不能修改其中的文本。
wx.TE_RIGHT:控件中的文本右对齐。

像其它样式标记一样,它们可以使用|符号来组合使用,尽管其中的三个对齐标记是相互排斥的。

wx.TextCtrl的文本处理方法:
AppendText(text):在尾部添加文本。
Clear():重置控件中的文本为“”。并且生成一个文本更新事件。
EmulateKeyPress(event):产生一个按键事件,插入与事件相关联的控制符,就如同实际的按键发生了。
GetInsertionPoint()
SetInsertionPoint(pos)
SetInsertionPointEnd():得到或设置插入点的位置,位置是整型的索引值。控件的开始位置是0。
GetRange(from, to):返回控件中位置索引范围内的字符串。
GetSelection()
GetStringSelection()
SetSelection(from, to):GetSelection()以元组的形式返回当前所选择的文本的起始位置的索引值(开始,结束)。GetStringSelection()得到所选择的字符串SetSelection(from, to)设置选择的文本。
GetValue()
SetValue(value):SetValue()改变控件中的全部文本。GetValue()返回控件中所有的字符串。
Remove(from, to):删除指定范围的文本。
Replace(from, to, value):用给定的值替换掉指定范围内的文本。这可以改变文本的长度。
WriteText(text):类似于AppendText(),只是写入的文本被放置在当前的插入点。

wx.TextCtrl的事件:
EVT_TEXT:当控件中的文本改变时产生该事件。文本因用户的输入或在程序中使用SetValue()而被改变,都要产生该事件。
EVT_TEXT_ENTER:当用户在一个wx.TE_PROCESS_ENTER样式的文本控件中按下了回车键时,产生该事件。
EVT_TEXT_URL:如果在Windows系统上,wx.TE_RICH或wx.TE_RICH2样式被设置了,并且wx.TE_AUTO_URL样式也被设置了,那么当在文本控件内的URL上发生了一个鼠标事件时,该事件被触发。
EVT_TEXT_MAXLEN:如果使用SetMaxLength()指定了该控件的最大长度,那么当用户试图输入更长的字符串时,该事件被触发。你可能会用这个,例如,这时给用户显示一个警告消息。

 

例:如图

#文本输入控件
import wx

# 自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='文本框', size=(400, 200))
        self.Centre()  # 设置窗口居中
        panel = wx.Panel(self)

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        #FlexGridSizer布局,3行2列,垂直间隙10,水平间隙10
        fgs = wx.FlexGridSizer(3, 2, 10, 10)
        #静态文本框
        userid = wx.StaticText(panel, label="用户ID:")
        pwd = wx.StaticText(panel, label="密码:")
        content = wx.StaticText(panel, label="多行文本:")
        #文本输入控件
        tc1 = wx.TextCtrl(panel)
        tc2 = wx.TextCtrl(panel, style=wx.TE_PASSWORD)#密码
        tc3 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)#多行文本

        # 设置tc1初始值,即默认值
        tc1.SetValue('toni')
        # 获取tc1值
        print('读取用户ID:{0}'.format(tc1.GetValue()))

        fgs.AddMany([userid, (tc1, 1, wx.EXPAND),
                     pwd, (tc2, 1, wx.EXPAND),
                     content, (tc3, 1, wx.EXPAND)])
        #设置行列所占空间比例
        fgs.AddGrowableRow(0, 1)
        fgs.AddGrowableRow(1, 1)
        fgs.AddGrowableRow(2, 3)
        fgs.AddGrowableCol(0, 1)
        fgs.AddGrowableCol(1, 2)
        
        hbox.Add(fgs, proportion=1, flag=wx.ALL | wx.EXPAND, border=15)
        panel.SetSizer(hbox)


class App(wx.App):

    def OnInit(self):
        # 创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True


if __name__ == '__main__':
    app = App()
    app.MainLoop()  # 进入主事件循环

 

3.复选框和单选按钮

复选框:wx.CheckBox
单选按钮:wx.RadioButton

注意:单选按钮不能单独使用,至少要有两个。
单选按钮使用时每个选项必须分组,组内每个选项具有互斥性

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声明的,而后来的没有。结果导致所有的按钮都被认为在同一组中,这样一来,敲击它们中的一个时,先前被选中按钮将关闭。

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()方法,只是为了让代码看起来更易明白。
 

例:如图

#复选框和单选按钮
import wx

# 自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='复选框和单选按钮', size=(400, 130))
        self.Centre()  # 设置窗口居中
        panel = wx.Panel(self)

        #水平box布局管理器对象1,在这个布局管理器中添加一个复选框
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        statictext = wx.StaticText(panel, label='选择你喜欢的编程语言:')#静态文本标签
        cb1 = wx.CheckBox(panel, 1, 'Python')#3个checkbox,123为id
        cb2 = wx.CheckBox(panel, 2, 'Java')
        cb2.SetValue(True)#让第二个复选框为选中状态,设置value值为true
        cb3 = wx.CheckBox(panel, 3, 'C++')
        self.Bind(wx.EVT_CHECKBOX, self.on_checkbox_click, id=1, id2=3)#绑定事件
        #将statictext和3个checkbox添加到hbox
        hbox1.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
        hbox1.Add(cb1, 1, flag=wx.ALL | wx.FIXED_MINSIZE)
        hbox1.Add(cb2, 1, flag=wx.ALL | wx.FIXED_MINSIZE)
        hbox1.Add(cb3, 1, flag=wx.ALL | wx.FIXED_MINSIZE)


        #水平box布局管理器对象2,在这个布局管理器中添加一个单选框
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        statictext = wx.StaticText(panel, label='选择性别:')
        radio1 = wx.RadioButton(panel, 4, '男', style=wx.RB_GROUP)
        #id不要重复,分组:通过style属性指定,一直到遇见下一个style=wx.RB_GROUP,这之间的单选按钮均为一组
        radio2 = wx.RadioButton(panel, 5, '女')
        self.Bind(wx.EVT_RADIOBUTTON, self.on_radio1_click, id=4, id2=5)#绑定事件
        hbox2.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
        hbox2.Add(radio1, 1, flag=wx.ALL | wx.FIXED_MINSIZE)
        hbox2.Add(radio2, 1, flag=wx.ALL | wx.FIXED_MINSIZE)
        
        
        #水平box布局管理器对象3,在这个布局管理器中添加另一个单选框
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        statictext = wx.StaticText(panel, label='选择你最喜欢吃的水果:')
        radio3 = wx.RadioButton(panel, 6, '苹果', style=wx.RB_GROUP)#另一组单选按钮
        radio4 = wx.RadioButton(panel, 7, '橘子')
        radio5 = wx.RadioButton(panel, 8, '香蕉')
        self.Bind(wx.EVT_RADIOBUTTON, self.on_radio2_click, id=6, id2=8)#绑定时间
        hbox3.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
        hbox3.Add(radio3, 1, flag=wx.ALL | wx.FIXED_MINSIZE)
        hbox3.Add(radio4, 1, flag=wx.ALL | wx.FIXED_MINSIZE)
        hbox3.Add(radio5, 1, flag=wx.ALL | wx.FIXED_MINSIZE)

        #只是一个垂直box布局管理器,将以上三个水平布局管理器放入
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(hbox1, 1, flag=wx.ALL | wx.EXPAND, border=5)
        vbox.Add(hbox2, 1, flag=wx.ALL | wx.EXPAND, border=5)
        vbox.Add(hbox3, 1, flag=wx.ALL | wx.EXPAND, border=5)
        panel.SetSizer(vbox)


#绑定的事件处理
    def on_checkbox_click(self, event):
        cb = event.GetEventObject()#从event中取出对应的事件源对象
        print('选择 {0},状态{1}'.format(cb.GetLabel(), event.IsChecked()))
        #例输出:选择Python,状态True
        #例输出:选择Python,状态False

    def on_radio1_click(self, event):
        rb = event.GetEventObject()
        print('第一组 {0} 被选中'.format(rb.GetLabel()))
        #例输出:第一组 女 被选中

    def on_radio2_click(self, event):
        rb = event.GetEventObject()
        print('第二组 {0} 被选中'.format(rb.GetLabel()))

class App(wx.App):

    def OnInit(self):
        # 创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True


if __name__ == '__main__':
    app = App()
    app.MainLoop()  # 进入主事件循环

 

4.下拉列表

wxPython 提供了两种下拉列表控件类:wx.ComboBox 和 wx.Choice
wx.ComboBox默认它的文本框是可以修改的,wx.Choice 是只读不可以修改的,除此之外他们没有区别。

对于wx.ComboBox来说有4种样式(style属性值)。其中的两种决定了如何绘制组合框:
wx.CB_DropDOWN创建一个带有下拉列表的组合框,wx.CB_SIMPLE创建一个带有列表框的组合框。在Windows上你可以只使用wx.CB_SIMPLE样式。

任何组合框都可以被指定为wx.CB_READONLY样式,它防止用户在文本域中键入。当组合框被指定为只读时,所做的选择必须来自于选择列表的元素之一,即使你用程序来设置它也不行。
最后wx.CB_SORT样式导致选择列表中的元素按字母顺序显示。

 

例:如图

#下拉列表 
import wx

# 自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='下拉列表', size=(400, 130))
        self.Centre()  # 设置窗口居中
        panel = wx.Panel(self)

        #水平box布局管理器对象1
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        statictext = wx.StaticText(panel, label='选择你喜欢的编程语言:')
        list1 = ['Python', 'C++', 'Java']
        #ch1下拉列表,value为默认值,choices对应一个列表,style=wx.CB_SORT使选择列表中的元素按字母顺序显示。
        ch1 = wx.ComboBox(panel, -1, value='C', choices=list1, style=wx.CB_SORT)
        self.Bind(wx.EVT_COMBOBOX, self.on_combobox, ch1)#绑定事件
        hbox1.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
        hbox1.Add(ch1, 1, flag=wx.ALL | wx.FIXED_MINSIZE)

        #水平box布局管理器对象2
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        statictext = wx.StaticText(panel, label='选择性别:')
        list2 = ['男', '女']
        ch2 = wx.Choice(panel, -1, choices=list2)
        self.Bind(wx.EVT_CHOICE, self.on_choice, ch2)
        hbox2.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
        hbox2.Add(ch2, 1, flag=wx.ALL | wx.FIXED_MINSIZE)


        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(hbox1, 1, flag=wx.ALL | wx.EXPAND, border=5)
        vbox.Add(hbox2, 1, flag=wx.ALL | wx.EXPAND, border=5)
        panel.SetSizer(vbox)

    def on_combobox(self, event):
        print('选择 {0}'.format(event.GetString()))
        #例输出:选择 Java

    def on_choice(self, event):
        print('选择 {0}'.format(event.GetString()))


class App(wx.App):

    def OnInit(self):
        # 创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True


if __name__ == '__main__':
    app = App()
    app.MainLoop()  # 进入主事件循环

 

5.列表

列表控件类似于下拉列表控件,只是没有文本框,只有一个列表选项。
列表控件可以单选或多选。列表控件类是 wx.ListBox。

列表框的选择类型样式(style取值)
wx.LB_EXTENDED:(多选)用户可以通过使用shift/Ctrl并敲击鼠标来选择一定范围内的连续的选项,或使用等同功能的按键。
wx.LB_MULTIPLE:(多选)用户可以一次选择多个选项(选项可以是不连续的)。实际上,在这种情况下,列表框的行为就像是一组复选框。
wx.LB_SINGLE:(单选)用户一次只能选一个选项。实际上,在这种情况下,列表框的行为就像是一组单选按钮。

列表框的滚动条类型样式
wx.LB_ALWAYS_SB:列表框将始终显示一个垂直的滚动条,不管有没有必要。
wx.LB_HSCROLL:如果本地控支持,那么列表框在选择项太多时,将创建一个水平滚动条。
wx.LB_HSCROLL:列表框只在需要的时候显示一个垂直的滚动条。这是默认样式。
还有一个样式wx.LB_SORT(排序),它使得列表中的元素按字母顺序排序。

有两个专用于wx.ListBox的命令事件。
EVT_LISTBOX事件在当列表中的一个元素被选择时触发(即使它是当前所选择的元素)。
如果列表被双击,EVT_LISTBOX_DCLICK事件发生。

例:如图

import wx

# 自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='下拉列表', size=(350, 180))
        self.Centre()  # 设置窗口居中
        panel = wx.Panel(self)

        #水平box布局管理器对象1
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        statictext = wx.StaticText(panel, label='选择你喜欢的编程语言:')
        list1 = ['Python', 'C++', 'Java']
        lb1 = wx.ListBox(panel, -1, choices=list1, style=wx.LB_SINGLE)#单选
        self.Bind(wx.EVT_LISTBOX, self.on_listbox1, lb1)#绑定事件
        hbox1.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
        hbox1.Add(lb1, 1, flag=wx.ALL | wx.FIXED_MINSIZE)


        #水平box布局管理器对象2
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        statictext = wx.StaticText(panel, label='选择你喜欢吃的水果:')
        list2 = ['苹果', '橘子', '香蕉']
        lb2 = wx.ListBox(panel, -1, choices=list2, style=wx.LB_EXTENDED)#多选
        self.Bind(wx.EVT_LISTBOX, self.on_listbox2, lb2)
        hbox2.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
        hbox2.Add(lb2, 1, flag=wx.ALL | wx.FIXED_MINSIZE)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(hbox1, 1, flag=wx.ALL | wx.EXPAND, border=5)
        vbox.Add(hbox2, 1, flag=wx.ALL | wx.EXPAND, border=5)
        panel.SetSizer(vbox)

    def on_listbox1(self, event):
        listbox = event.GetEventObject()
        print('选择 {0}'.format(listbox.GetSelection()))
        #GetSelection()获取当前所选择的单选按钮的整数索引

    def on_listbox2(self, event):
        listbox = event.GetEventObject()
        print('选择 {0}'.format(listbox.GetSelections()))

    '''
    GetSelection()得到当前选择项的整数索引(仅对于单选列表)。
    对于多选列表,使用GetSelections()来返回包含所选项目的整数位置的元组。
    '''

class App(wx.App):

    def OnInit(self):
        # 创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True


if __name__ == '__main__':
    app = App()
    app.MainLoop()  # 进入主事件循环

 

说明:在4下拉列表中,ch1 = wx.ComboBox(panel, -1, value='C', choices=list1, style=wx.CB_SORT)

这里将style值改为wx.CB_SIMPLE,则显示为像下图样式,由此可看出与上面的差别。

 

6.静态图片控件

静态图片控件类是 wx.StaticBitmap。

在wxPython中,图像处理是一个双主管系统,与平台无关的图像处理由类wx.Image管理,而与平台有关的图像处理由类wx.Bitmap管理。
实际上,意思就是外部文件格式由wx.Image装载和保存,而wx.Bitmap负责将图像显示到屏幕。

wx.Bitmap构造函数:
wx.Bitmap(name, type=wx.BITMAP_TYPE_ANY)。
参数name是一个文件名,type可以为图片格式

#静态图片控件
#界面初始显示一张图片,点击按钮,换一张图片
import wx

# 自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='静态图片控件', size=(300, 300))
        #创建bitmap列表对象,指定图片路径和格式
        self.bmps = [wx.Bitmap('images/bird5.gif', wx.BITMAP_TYPE_GIF),
                     wx.Bitmap('images/bird4.gif', wx.BITMAP_TYPE_GIF),
                     wx.Bitmap('images/bird3.gif', wx.BITMAP_TYPE_GIF)]

        self.Centre()  # 设置窗口居中
        self.panel = wx.Panel(parent=self)
        
        # 创建垂直方向的Box布局管理器
        vbox = wx.BoxSizer(wx.VERTICAL)
        b1 = wx.Button(parent=self.panel, id=1, label='Button1')
        b2 = wx.Button(self.panel, id=2, label='Button2')
        self.Bind(wx.EVT_BUTTON, self.on_click, id=1, id2=2)#绑定事件
        self.image = wx.StaticBitmap(self.panel, -1, self.bmps[0])#创建静态图片

        # 添加标控件到vbox布局管理器
        vbox.Add(b1, proportion=1, flag=wx.CENTER | wx.EXPAND)
        vbox.Add(b2, proportion=1, flag=wx.CENTER | wx.EXPAND)
        vbox.Add(self.image, proportion=3, flag=wx.CENTER)

        self.panel.SetSizer(vbox)

    def on_click(self, event):#上面两个按钮调用一个事件处理方法
        event_id = event.GetId()
        if event_id == 1:
            self.image.SetBitmap(self.bmps[1])
        else:
            self.image.SetBitmap(self.bmps[2])
        self.panel.Layout()#刷新面板,panel是成员变量


class App(wx.App):

    def OnInit(self):
        # 创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True


if __name__ == '__main__':
    app = App()
    app.MainLoop()  # 进入主事件循环

 

 

 

 

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
wxPython 学习文档是一套提供给开发者学习和使用 wxPython 的资源和指南。它包含了关于 wxPython 的详细介绍、学习指导、示例代码以及常见问题解答等内容。 wxPython 是一种基于 Python 编程语言的图形用户界面(GUI) 工具包,它使用了 wxWidgets 库作为底层实现,可以用来创建跨平台的桌面应用程序。学习 wxPython 文档是入门 wxPython 开发的重要步骤。以下是 wxPython 学习文档通常包含的内容: 1. 简介和安装指南:文档中会介绍 wxPython 的背景和特点,以及如何在不同操作系统上安装和配置 wxPython。 2. 入门教程:文档会提供一个从零开始的教程,介绍如何创建一个基本的 wxPython 应用程序,包括创建窗口、添加控件、处理事件等。 3. 组件和控件的使用说明:针对不同类型的控件(如按钮、文本框、列表框等),文档会提供详细的使用说明,包括控件的属性、方法、事件等。 4. 常用布局管理器和容器类:文档会介绍 wxPython 中的布局管理器和容器类的使用方法,帮助开发者更灵活地设计界面布局。 5. 高级主题和技巧:文档中会涵盖一些进阶的主题和技巧,如自定义控件、多线程编程、菜单和工具栏的使用等。 6. 示例代码和项目:文档中会提供一些示例代码和项目,用于演示和实践各种 wxPython 的用法和技巧。 7. 常见问题解答和开发者社区:文档中会收集和解答一些常见问题,并提供开发者社区的链接,方便开发者交流和寻求帮助。 通过学习 wxPython 学习文档,开发者可以系统地了解和学习 wxPython,从简单到复杂地掌握 wxPython 的使用技巧,并最终能够自主设计和开发出功能强大、美观易用的桌面应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值