wxPython 实践(一)概述
wxPython 实践(二)基础控件
wxPython 实践(三)页面布局
wxPython 实践(四)事件响应
wxPython 实践(五)高级控件
wxPython 实践(六)对话框
wxPython 实践(七)GDI 介绍
wxPython 实践(八)其他
文章目录
- [1. wx.Frame](#1. wx.Frame)
- [2. wx.Panel(面板类)](#2. wx.Panel(面板类))
- [3. wx.StaticText(静态文本标签)](#3. wx.StaticText(静态文本标签))
- [4. wx.StaticBitmap(静态图片)](#4. wx.StaticBitmap(静态图片))
- [5. wx.StaticLine(静态分割线)](#5. wx.StaticLine(静态分割线))
- [6. wx.StaticBox(静态框)](#6. wx.StaticBox(静态框))
- [7. wx.TextCtrl(文本输入框)](#7. wx.TextCtrl(文本输入框))
- [8. wx.Button 按钮控件](#8. wx.Button 按钮控件)
- [9. wx.RadioButton 和 wx.RadioBox](#9. wx.RadioButton 和 wx.RadioBox)
-
- [9.1. wx.RadioButton](#9.1. wx.RadioButton)
- [9.2. wx.RadioBox](#9.2. wx.RadioBox)
- [9.3. 实例](#9.3. 实例)
- [10. wx.CheckBox(复选框)](#10. wx.CheckBox(复选框))
- [11. wx.ComboBox 与 wx.Choice](#11. wx.ComboBox 与 wx.Choice)
-
- [11.1. wx.ComboBox](#11.1. wx.ComboBox)
- [11.2. wx.Choice](#11.2. wx.Choice)
- [11.3. 实例](#11.3. 实例)
- [12. wx.Gauge(进度条)](#12. wx.Gauge(进度条))
- [13. wx.Slider(滑块)](#13. wx.Slider(滑块))
- [14. wx.ScrollBar(滚动条)](#14. wx.ScrollBar(滚动条))
官网
https://docs.wxpython.org/wx.1moduleindex.html
https://www.w3ccoo.com/wxpython/wxpython_major_classes.html
系列文章:
https://wintel.blog.csdn.net/?type=blog
wxPython 提供了丰富多样的控件(Widgets),这些控件是构成用户界面的基础元素。在构建桌面应用程序时,熟练使用和理解这些控件是必不可少的。
以下列出了一些常用的 wxPython 控件及其功能:
1. wx.Frame
类的定义:
- wx.Frame 类有 一个没有参数的默认构造函数;
- 也有一个重载的构造函数。
python
wx.Frame(parent, id, title, pos, size, style, name)
- parent 窗口父级:如果选择了'None',对象就在顶层窗口。如果没有选择 "None",框架就会出现在父窗口的上面;
- id 窗口标识符:通常是 -1,让标识符自动生成;
- title 标题:出现在标题栏中的说明;
- pos 帧的起始位置:如果没有给出,wx.DefaultPosition 是由操作系统决定的;
- size 窗口的尺寸:参数为元组=(宽度px,高度px);wx.DefaultSize 由操作系统决定;
- style 窗口的外观:由样式常数控制:
wx.CAPTION
wx.MINIMIZE_BOX
wx.MAXIMIZE_BOX
wx.CLOSE_BOX
wx.SYSTEM_MENU
wx.RESIZE_BORDER
wx.STAY_ON_TOP
wx.FRAME_FLOAT_ON_PARENT
其中 wx.DEFAULT_FRAME_STYLE 被定义为:wx.MINIMIZE_BOX|wx.MAXIMIZE_BOX|wx.RESIZE_BORDER|wx.SYSTEM_MENU|wx.CAPTION|wx.CLOSE_BOX|wx.CLIP_CHILDREN - name 对象的内部名称。
成员方法:
- CreateStatusBar() 在窗口的底部创建状态栏;
- CreateToolBar() 在窗口的顶部或左侧创建工具栏;
- GetMenuBar() 获取对菜单栏的引用;
- GetStatusBar() 获取对状态栏的引用;
- SetMenuBar() 显示框架中的菜单栏对象;
- SetStatusBar() 将状态栏对象关联到框架中;
- SetToolBar() 将工具条对象关联到框架上;
- SetStatusText() 在状态栏上显示文本;
- Create() 用提供的参数创建一个框架;
- Centre() 将框架放置在显示器的中心位置;
- SetSize() 将框架调整到给定的尺寸;
- SetTitle() 在标题栏中插入给定的文本;
- Move(wx.Point point): 将窗口移至指定位置;
- MoveXY(int x, int y): 将窗口移至指定位置;
- SetPosition(wx.Point point): 设置窗口的位置;
- SetDimensions(x, y, width, height, sizeFlags): 设置窗口的位置和大小;
绑定事件:
- EVT_CLOSE:当框架被用户点击关闭按钮或以编程方式关闭时
- EVT_MENU_OPEN:当一个菜单即将被打开时
- EVT_MENU_CLOSE:当一个菜单刚刚被关闭时
- EVT_MENU_HIGHLIGHT:当指定ID的菜单项被高亮显示时
2. wx.Panel(面板类)
wx.Panel 类 通常被放置在 wx.Frame 对象中。这个类也是继承自 wx.Window 类。
尽管控件可以通过指定屏幕坐标的位置来手动放置在面板上,但建议使用一个合适的布局方案,在 wx.Python 中称为 sizer ,以便更好地控制放置和解决大小调整的问题。
在 wx.Panel 构造函数中,父参数是 wx.Frame 对象,面板将被放置在其中。id 参数的默认值是 wx.ID_ANY,而默认样式参数是 wx.TAB_TRAVERSAL。
3. wx.StaticText(静态文本标签)
静态文本控件 wx.StaticText 用来显示一行或者多行的只读文本。
它可以被称为被动控件,因为它不产生任何事件。
python
wx.StaticText(parent, id, label, position, size, style)
style 控制标签在尺寸范围内的对齐方式:
- wx.ALIGN_LEFT:文本左对齐。
- wx.ALIGN_RIGHT:文本右对齐。
- wx.ALIGN_CENTRE_HORIZONTAL:文本水平居中对齐。
- wx.ST_NO_AUTORESIZE:默认情况下,静态文本控件会在调用SetLabel以后自动改变大小以使得其大小刚好满足标签文本的需要,如果设置了这个类型,则标签不会改变自己的大小。通常这个类型应该和上面的对齐类型一起使用因为如果没有设置这个类型,自动调整大小使得对齐没有任何意义。
- wx.ST_ELLIPSIZE_START:如果标签文本宽度超过控制宽度,则将标签的开头替换为省略号。
- wx.ST_ELLIPSIZE_MIDDLE:如果标签文本宽度超过控制宽度,则将标签中间替换为省略号。
- wx.ST_ELLIPSIZE_END:如果标签文本宽度超过控制宽度,则将标签的结尾替换为省略号。
成员方法:
- GetLabel(self):获取控件中显示的文本标签;
- SetLabel(self, label):更改控件中显示的文本标签;
- SetForeGroundColour() 设置标签文本的颜色;
- SetBackGroundColour() 设置标签的背景;
- IsEllipsized(self):如果此控件的窗口样式包含 ST_ELLIPSIZE_START、ST_ELLIPSIZE_MIDDLE 或 ST_ELLIPSIZE_END 样式之一,则返回True;
- Wrap(self, width):文本超出设置宽度后自动换行。如果 width 为负,则不进行自动换行。注意,这个宽度不一定是控件的总宽度,因为可能会添加一些边框像素(取决于控件的边框样式)。
实例:
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
# super(MyWin, self).__init__(parent, title = title, size=(600,200))
super().__init__(parent, title=title)
panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
# 居中标签
lbl = wx.StaticText(panel, -1, style=wx.ALIGN_CENTER)
txt1 = "Python GUI development"
txt2 = "using wxPython"
txt3 = " Python port of wxWidget "
txt = txt1+"\n"+txt2+"\n"+txt3
font = wx.Font(18, wx.ROMAN, wx.ITALIC, wx.NORMAL)
lbl.SetFont(font)
lbl.SetLabel(txt)
box.Add(lbl, 0, wx.ALIGN_CENTER)
# 居右标签
lblwrap = wx.StaticText(panel, -1, style=wx.ALIGN_RIGHT)
txt = txt1+txt2+txt3
lblwrap.SetLabel(txt)
lblwrap.Wrap(200)
box.Add(lblwrap, 0, wx.ALIGN_LEFT)
# 居左标签
# lbl1 = wx.StaticText(panel, -1, style=wx.ALIGN_LEFT|wx.ST_ELLIPSIZE_MIDDLE)
lbl1 = wx.StaticText(panel, -1, style=wx.ALIGN_LEFT)
lbl1.SetLabel(txt)
lbl1.SetForegroundColour((255, 0, 0))
lbl1.SetBackgroundColour((0, 0, 0))
font = self.GetFont()
font.SetPointSize(10)
lbl1.SetFont(font)
box.Add(lbl1, 0, wx.ALIGN_LEFT)
panel.SetSizer(box)
self.Centre()
self.Show()
if __name__ == "__main__":
app = wx.App()
MyWin(None, 'StaticText demo')
app.MainLoop()

4. wx.StaticBitmap(静态图片)
静态位图控件 wx.StaticBitmap 用来显示一个位图。
某些平台上的本机实现仅用于显示对话框中的小图标。注意,为了获得最佳效果,如果没有显式地调整大小,则默认情况是控件的大小应该与其中显示的图像的大小相同。可以使用 SetScaleMode 来控制图像在控件中的缩放方式。
常用方法:
- GetBitmap(self):返回控件中当前使用的位图。注意:即使使用了 SetIcon,也可以调用此方法。
- GetIcon(self):返回控件中当前使用的图标。注意:此方法只能在使用 SetIcon 时调用。如果已经设置了位图(使用 wx.StaticBitmap.SetBitmap),则无法从控件中获得图标。
- GetScaleMode(self):返回控件当前使用的缩放模式。
- SetBitmap(self, label):设置控件使用的位图。
- SetIcon(self, label):设置控件使用的图标。
- SetScaleMode(self, scaleMode):设置控件使用的缩放方式。
实例(静态布局):
python
import wx
import os
class MyWin(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title = title)
self.SetTitle(title=title)
panel = wx.Panel(self)
image_path = os.path.dirname(__file__)
bmpOri = wx.Image(image_path + "/python.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
# 第一种缩放方式
# 将位图转换为图片后在改变尺寸
bmpOne = wx.Bitmap(image_path + "/python.png", wx.BITMAP_TYPE_ANY).ConvertToImage().Scale(50, 50)
# 再次转换成位图
resOne = wx.Bitmap(bmpOne, wx.BITMAP_SCREEN_DEPTH)
# 第二种缩放方式
# 通过 wx.Image 加载图片,并缩放图片到长宽为50, 50的尺寸
# imgTwo = wx.Image(image_path + "/python.png", "image/png").Scale(50, 50)
imgTwo = wx.Image(image_path + "/python.png", wx.BITMAP_TYPE_ANY).Scale(50, 50)
# 转换图片成位图
bmpTwo = wx.Bitmap(imgTwo, wx.BITMAP_SCREEN_DEPTH)
wx.StaticBitmap(panel, wx.ID_ANY, bmpOri, pos=(10, 20), size=(300, 156))
wx.StaticBitmap(panel, wx.ID_ANY, resOne, pos=(320, 20))
wx.StaticBitmap(panel, wx.ID_ANY, bmpTwo, pos=(320, 120))
if __name__ == '__main__':
app = wx.App()
window = MyWin(None, title="StaticBitmap")
window.Show()
app.MainLoop()

实例(动态布局):
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title = title)
self.SetTitle(title=title)
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
import os
image_path = os.path.dirname(__file__)
imgOri = wx.Image(image_path + "/python.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
# txtOne = wx.StaticBitmap(panel, wx.ID_ANY, bmpOri, pos=(10, 20), size=(300, 156))
bmpOri = wx.StaticBitmap(panel, wx.ID_ANY, imgOri)
sizer.Add(bmpOri, 0, wx.ALL, 5)
panel.SetSizer(sizer)
# self.Centre()
if __name__ == '__main__':
app = wx.App()
window = MyWin(None, title="StaticBitmap")
window.Show()
app.MainLoop()
参考:
https://www.cnblogs.com/liyuanhong/p/12129698.html
5. wx.StaticLine(静态分割线)
这个控件用来在其父窗口上显示一个水平或者垂直的长条,以便作为子窗口的静态分割条。
相应的,其样式有两种:
- wx.LI_HORIZONTAL:生成一条水平线。默认。
- wx.LI_VERTICAL:生成一条垂直线。
常用方法:
- IsVertical(self):如果线是垂直的,则返回True, 如果是水平的,则返沪False。
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title = title)
self.SetTitle(title=title)
panel = wx.Panel(self)
wx.StaticLine(panel, pos=(30, 50), size=(240, 1))
wx.StaticLine(panel, pos=(30, 50), size=(10, 140), style=wx.LI_VERTICAL)
if __name__ == '__main__':
app = wx.App()
window = MyWin(None, title="StaticLine")
window.Show()
app.MainLoop()

6. wx.StaticBox(静态框)
静态框 wx.StaticBox 是围绕其他窗口绘制的矩形,用于表示项目的逻辑分组。
这个控件可以有两种使用方式:
- 一种是作为兄弟窗口环绕在其他控件周围;
- 一种是将其作为父窗口,它所包围的控件作为其字窗口放在其中。
常用方法:
- Enable(self, enable=True):启用或禁用方框,但不影响其标签窗口(如果有)。
- GetBordersForSizer(self):返回 StaticBox 中边界可能需要的额外空间。
实例(静态布局):
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title = title)
self.SetTitle(title=title)
panel = wx.Panel(self)
sbox = wx.StaticBox(panel, label="个人信息", pos=(5, 5), size=(240, 90))
# sbox.Enable(False)
# as parent
wx.CheckBox(sbox, label="男性", pos=(15, 30))
wx.CheckBox(sbox, label="已婚", pos=(15, 55))
# as brother
wx.StaticText(panel, label="年龄", pos=(15, 105))
wx.SpinCtrl(panel, value="30", pos=(55, 100), size=(60, -1), min=1, max=120)
self.Centre()
if __name__ == '__main__':
app = wx.App()
window = MyWin(None, title="StaticBox")
window.Show()
app.MainLoop()

实例(动态布局):
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title = title)
self.SetTitle(title=title)
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
# sbox = wx.StaticBox(self, label="个人信息", pos=(5, 5), size=(240, 90))
sbox = wx.StaticBox(panel, label="个人信息", size=(240, 90))
# sbox.Enable(False)
# 内部布局
inner = wx.StaticBoxSizer(sbox, wx.VERTICAL)
cb1 = wx.CheckBox(panel, label="男性")
cb2 = wx.CheckBox(panel, label="已婚")
inner.Add(cb1, 0, flag=wx.EXPAND|wx.ALL, border=5)
inner.Add(cb2, 0, flag=wx.EXPAND|wx.ALL, border=5)
sizer.Add(inner, proportion=1, flag=wx.EXPAND|wx.ALL, border=5)
panel.SetSizer(sizer)
# self.Centre()
if __name__ == '__main__':
app = wx.App()
window = MyWin(None, title="StaticBitmap")
window.Show()
app.MainLoop()
7. wx.TextCtrl(文本输入框)
在 wxPython中,wx.TextCtrl 类的一个对象起到了这个作用。它是一个可以显示和编辑文本的控件。
类的定义:
python
wx.TextCtrl(parent, id, value, pos, size, style)
样式参数从以下列表中获取一个或多个常量
- wx.TE_MULTILINE 该文本控件允许多行。如果没有指定这个样式,断行符不应该在控件的值中使用。
- wx.TE_PASSWORD 该文本将以星号形式回显。
- wx.TE_READONLY 文本将不能被用户编辑。
- wx.TE_LEFT 控件中的文本将被左对齐(默认)。
- wx.TE_CENTRE 控件中的文本将居中。
- wx.TE_RIGHT 控件中的文本将被右对齐。
成员方法:
- AppendText() 将文本添加到文本控件的末端。
- Clear() 清除内容
- GetValue() 返回文本框的内容
- 替换() 替换方框内的全部或部分文本
- SetEditable() 使文本框可编辑或只读
- SetMaxLength() 设置控件可容纳的最大字符数
- SetValue() 以编程方式设置文本框中的内容
- IsMultiLine() 如果设置为TE_MULTILINE,则返回真。
绑定事件:
- EVT_TEXT 响应文本框内容的变化,可以是手动输入,也可以是程序性输入
- EVT_TEXT_ENTER 当文本框中的回车键被按下时,调用相关处理程序,style 需要设置成 wx.TE_PROCESS_ENTER。
- EVT_TEXT_MAXLEN 当输入的文本长度达到 SetMaxLength() 函数的值时,触发相关处理程序。
实例:
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
# super(MyWin, self).__init__(parent, title = title,size = (350,250))
super().__init__(parent, title = title)
# 主布局
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
# 第一行
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
l1 = wx.StaticText(panel, -1, "Text Field")
self.t1 = wx.TextCtrl(panel)
hbox1.Add(l1, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, 5)
hbox1.Add(self.t1, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, 5)
vbox.Add(hbox1)
self.t1.Bind(wx.EVT_TEXT, self.OnKeyTyped)
# 第二行
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
l2 = wx.StaticText(panel, -1, "password field")
self.t2 = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
self.t2.SetMaxLength(5)
hbox2.Add(l2, 1, wx.ALIGN_LEFT|wx.ALL,5)
hbox2.Add(self.t2, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox2)
self.t2.Bind(wx.EVT_TEXT_MAXLEN, self.OnMaxLen)
# 第三行
hbox3 = wx.BoxSizer(wx.HORIZONTAL)
l3 = wx.StaticText(panel, -1, "Multiline Text")
# textctrl 绑定 wx.EVT_TEXT_ENTER,style 需要设置成 wx.TE_PROCESS_ENTER:
self.t3 = wx.TextCtrl(panel, size=(200,100), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
hbox3.Add(l3, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
hbox3.Add(self.t3, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox3)
self.t3.Bind(wx.EVT_TEXT_ENTER, self.OnEnterPressed)
# 第四行
hbox4 = wx.BoxSizer(wx.HORIZONTAL)
l4 = wx.StaticText(panel, -1, "Read only text")
self.t4 = wx.TextCtrl(panel, value="ReadOnly Text", style=wx.TE_READONLY|wx.TE_CENTER)
hbox4.Add(l4, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
hbox4.Add(self.t4, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox4)
panel.SetSizer(vbox)
self.Centre()
self.Show()
self.Fit()
def OnKeyTyped(self, event):
print(event.GetString())
def OnEnterPressed(self, event):
print("Enter pressed")
def OnMaxLen(self, event):
print("Maximum length reached")
if __name__ == "__main__":
app = wx.App()
MyWin(None, 'TextCtrl demo')
app.MainLoop()

8. wx.Button 按钮控件
https://wintel.blog.csdn.net/article/details/130894771?spm=1001.2014.3001.5502
9. wx.RadioButton 和 wx.RadioBox
9.1. wx.RadioButton
每个按钮,wx.RadioButton 类的一个对象在一个圆形按钮旁边携带一个文本标签。它的对象为组提供一个边框和标签。
类的定义:
python
wx.RadioButton(parent, id, label, pos, size, style)
- 样式参数只存在于组中的第一个按钮
它的值是 wx.RB_GROUP。对于组中的后续按钮,可以选择使用 wx.RB_SINGLE 样式参数。
成员方法:
- SetValue() 以编程方式选择或取消选择一个按钮
- GetValue() 如果一个按钮被选中则返回真,否则返回假。
绑定事件:
- wx.EVT_RADIOBUTTON 在每次点击组中的任何按钮时都会触发相关的处理程序。
9.2. wx.RadioBox
一个 wx.RadioBox 在一个静态框中放置了一组互斥的按钮,该组中的每个按钮都从 List 对象 choices 获取标签。
类的定义:
python
wx.RadioBox(parent, id, label, pos, size, choices[], majorDimension, style)
choices wx.RadioBox 一组互斥按钮的标签;
style wx.RadioBox 中的按钮是以行或列的方式排列的。wx.RA_SPECIFY_ROWS 或者 wx.RA_SPECIFY_COLS;
majorDimension 行/列的数量。
成员方法:
- GetSelection() 返回所选项目的索引。
- SetSelection() 以编程方式选择一个项目
- GetString() 返回所选项目的标签
- SetString() 将标签分配给所选项目
- Show() 显示或隐藏指定索引的项目
9.3. 实例
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
# super(MyWin, self).__init__(parent, title = title,size = (350,250))
super().__init__(parent, title = title)
pnl = wx.Panel(self)
self.rb1 = wx.RadioButton(pnl, 11, label='Value A', pos=(10,10), style=wx.RB_GROUP)
# self.rb1 = wx.RadioButton(pnl, 11, label='Value A', pos=(10,10), style=wx.RB_SINGLE)
self.rb2 = wx.RadioButton(pnl, 22, label='Value B', pos=(10,40))
self.rb3 = wx.RadioButton(pnl, 33, label='Value C', pos=(10,70))
self.Bind(wx.EVT_RADIOBUTTON, self.OnRadiogroup)
lblList = ['Value X', 'Value Y', 'Value Z', 'Value W']
# self.rbox = wx.RadioBox(pnl, label='RadioBox', pos=(80,10), choices=lblList, majorDimension=1, style=wx.RA_SPECIFY_ROWS)
self.rbox = wx.RadioBox(pnl, label='RadioBox', pos=(80,10), choices=lblList, majorDimension=3, style=wx.RA_SPECIFY_ROWS)
self.Centre()
self.Show(True)
def OnRadiogroup(self, e):
rb = e.GetEventObject()
print(rb.GetLabel(),' is clicked from Radio Group')
def onRadioBox(self, e):
print(self.rbox.GetStringSelection(),' is clicked from Radio Box')
if __name__ == "__main__":
app = wx.App()
MyWin(None, 'RadioButton and RadioBox')
app.MainLoop()

10. wx.CheckBox(复选框)
一个复选框显示一个有标签的小矩形框。当点击时,矩形内出现一个复选标记,以表示做出了选择。
类的定义:
python
wx.CheckBox(parent, id, label, pos, size, style)
可以使用以下风格参数值:
- wx.CHK_2STATE 创建双状态复选框。默认值
- wx.CHK_3STATE 创建三个状态的复选框。
- wx.ALIGN_RIGHT 将盒子的标签放在复选框的左边。
成员方法:
- GetState() 根据复选框是否被选中,返回真或假。
- SetValue() 用于以编程方式选择一个复选框。
绑定事件:
- wx.EVT_CHECKBOX 是唯一可用的事件绑定器。每次框架上的任何复选框被选中或取消选中时,相关的事件处理程序将被调用。
实例:
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
# super(MyWin, self).__init__(parent, title = title,size = (350,250))
super().__init__(parent, title = title)
pnl = wx.Panel(self)
self.cb1 = wx.CheckBox(pnl, label = 'Value A',pos = (10,10))
self.cb2 = wx.CheckBox(pnl, label = 'Value B',pos = (10,40))
self.cb3 = wx.CheckBox(pnl, label = 'Value C',pos = (10,70))
self.Bind(wx.EVT_CHECKBOX,self.onChecked)
self.Centre()
self.Show(True)
def onChecked(self, e):
cb = e.GetEventObject()
print(cb.GetLabel(),' is clicked',cb.GetValue())
if __name__ == "__main__":
app = wx.App()
MyWin(None, 'CheckBox')
app.MainLoop()

11. wx.ComboBox 与 wx.Choice
和选择类 一个wx.ComboBox对象显示一个可供选择的项目列表。它可以被配置为下拉列表或永久显示。wxPython API包含一个wx.Choice类,其对象也是一个下拉列表,它是永久只读的。
11.1. wx.ComboBox
类的定义:
python
wx.ComboBox(parent, id, value, pos, size, choices[], style)
样式参数:
- wx.CB_SIMPLE 组合框具有永久显示的列表;
- wx.CB_DROPDOWN 带下拉列表的组合框;
- wx.CB_READONLY 所选项目不可编辑;
- wx.CB_SORT 列表按字母顺序显示。
成员方法:
- GetCurrentSelection () 返回正在选择的项目;
- SetSelection() 将给定索引处的项目设置为选中的项目;
- GetString() 返回与给定索引处的项目相关的字符串;
- SetString() 改变给定索引处的项目的文本;
- SetValue() 设置一个字符串作为组合框编辑栏中显示的文本;
- GetValue() 返回组合框中文本字段的内容;
- FindString() 在列表中搜索给定的字符串;
- GetStringSelection() 获取当前所选项目的文本。
绑定事件:
- wx.COMBOBOX 当列表中的项目被选中时;
- wx.EVT_TEXT 当组合框文本发生变化时;
- wx.EVT_COMBOBOX_DROPDOWN 当列表下拉时;
- wx.EVT_COMBOBOX_CLOSEUP 当列表折叠起来时。
11.2. wx.Choice
python
wx.Choice(parent, id, pos, size, n, choices[], style)
参数 'n' 代表选择列表要被初始化的字符串数量。像 comboBox 一样,该列表是由choices[] 集合中的项目填充的。
样式参数:
- 只有一个样式参数被定义 wx.CB_SORT。
绑定事件:
- 只有一个事件绑定器处理这个类所发出的事件 wx.EVT_CHOICE。
11.3. 实例
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
# super(MyWin, self).__init__(parent, title = title,size = (350,250))
super().__init__(parent, title = title)
panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
# 回显控件
self.label = wx.StaticText(panel, label="You selected:", style=wx.ALIGN_CENTRE)
box.Add(self.label, 0, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, 20)
# box.Add(self.label, 0, wx.EXPAND|wx.ALL)
# 第一个下拉框
cblbl = wx.StaticText(panel,label = "Combo box",style = wx.ALIGN_CENTRE)
languages = ['C', 'C++', 'Python', 'Java', 'Perl']
self.combo = wx.ComboBox(panel,choices = languages)
self.combo.Bind(wx.EVT_COMBOBOX, self.OnCombo)
box.Add(cblbl, 0, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, 5)
box.Add(self.combo, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, 5)
# 第二个下拉框
chlbl = wx.StaticText(panel, label="Choice control", style=wx.ALIGN_CENTRE)
self.choice = wx.Choice(panel, choices=languages)
self.choice.Bind(wx.EVT_CHOICE, self.OnChoice)
box.Add(chlbl, 0, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, 5)
box.Add(self.choice, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, 5)
box.AddStretchSpacer()
panel.SetSizer(box)
self.Centre()
self.Show()
def OnCombo(self, event):
self.label.SetLabel("You selected:" + self.combo.GetValue() + " from Combobox")
def OnChoice(self, event):
self.label.SetLabel("You selected:" + self.choice.GetString(self.choice.GetSelection()) + " from Choice")
if __name__ == "__main__":
app = wx.App()
MyWin(None, 'ComboBox and Choice')
app.MainLoop()

参考:
https://wintel.blog.csdn.net/article/details/130897788?spm=1001.2014.3001.5502
12. wx.Gauge(进度条)
wx.Gauge 类对象显示一个垂直或水平条,它以图形方式显示递增的数量。
类的定义:
python
wx.Gauge(parent, id, range, pos, size, style)
仪表类可能的样式参数是:
- wx.GA_HORIZONTAL 进度条的水平布局
- wx.GA_VERTICAL 进度条的垂直布局
- wx.GA_SMOOTH 以一个像素宽的更新步骤平滑进度条
- wx.GA_TEXT 以百分比显示当前值
成员方法:
- GetRange() 返回仪表的最大值
- SetRange() 设置仪表的最大值
- GetValue() 返回仪表的当前值
- SetValue() 以编程方式设置当前值
- Pulse() 将仪表切换到不确定的模式
实例:
python
import wx
import time
class MyWin(wx.Frame):
def __init__(self, parent, title):
# super(MyWin, self).__init__(parent, title = title,size = (350,250))
super().__init__(parent, title = title)
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
# 进度条
self.gauge = wx.Gauge(pnl, range=20, size=(250, 25), style=wx.GA_HORIZONTAL)
hbox1.Add(self.gauge, proportion=1, flag=wx.ALIGN_CENTRE)
# 开始按钮
self.btn1 = wx.Button(pnl, label="Start")
self.Bind(wx.EVT_BUTTON, self.OnStart, self.btn1)
hbox2.Add(self.btn1, proportion=1, flag=wx.RIGHT, border=10)
vbox.Add((0, 30))
vbox.Add(hbox1, flag=wx.ALIGN_CENTRE)
vbox.Add((0, 20))
vbox.Add(hbox2, proportion=1, flag=wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnStart(self, e):
while True:
time.sleep(1);
self.count = self.count + 1
self.gauge.SetValue(self.count)
if self.count >= 20:
print("end")
return
if __name__ == "__main__":
app = wx.App()
MyWin(None, 'Gauge')
app.MainLoop()

13. wx.Slider(滑块)
wxPython API 包含 wx.Slider 类。它提供了与 Scrollbar 相同的功能。滑块提供了一种方便的方式,通过滑块特定的wx.EVT_SLIDER事件绑定器来处理拖动手柄。
wx.MenuBar 在顶层窗口的标题栏下面有一个水平条,用于显示一系列的菜单。它是wxPython API中wx.MenuBar类的一个对象。
类的定义:
python
wx.Slider(parent, id, value, minValue, maxValue, pos, size, style)
滑块的下限和上限是由 minValue 和 maxValue 参数设置的。
起始值是由 value 参数定义的。
样式参数值:
- wxSL_HORIZONTAL 水平滑块
- wxSL_VERTICAL 垂直滑块
- wxSL_AUTOTICKS 显示滑块上的刻度线
- wxSL_LABELS 显示最小、最大和当前值
- wxSL_MIN_MAX_LABELS 显示最小和最大值
- wxSL_VALUE_LABEL 只显示当前值
成员方法:
- GetMin() 返回滑块的最小值。
- GetMax( ) 返回滑块的最大值
- GetValue() 返回滑块的当前值
- SetMin() 设置滑块的最小值
- SetMax() 设置滑块的最大值
- SetRange() 设置滑块的最小值和最大值
- SetValue() 以编程方式设置当前值
- SetTick() 在给定的位置显示刻度线
- SetTickFreq() 设置最小值和最大值之间的刻度间隔
绑定事件:
- wx.EVT_SCROLL 处理滚动事件
- wx.EVT_SLIDER 当滑块的位置发生变化时,无论是通过移动手柄还是通过编程的方式
实例:
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
# super(MyWin, self).__init__(parent, title = title,size = (350,250))
super().__init__(parent, title = title)
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
self.sld = wx.Slider(pnl, value=10, minValue=1, maxValue=100, style=wx.SL_HORIZONTAL|wx.SL_LABELS)
# vbox.Add(self.sld, 1, flag=wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.TOP, border=20)
self.sld.Bind(wx.EVT_SLIDER, self.OnSliderScroll)
self.txt = wx.StaticText(pnl, label='Hello', style=wx.ALIGN_CENTER)
vbox.Add(self.sld, 1, flag=wx.EXPAND|wx.TOP, border=20)
vbox.Add(self.txt, 1, wx.ALIGN_CENTRE_HORIZONTAL)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnSliderScroll(self, e):
obj = e.GetEventObject()
val = obj.GetValue()
font = self.GetFont()
font.SetPointSize(self.sld.GetValue())
self.txt.SetFont(font)
if __name__ == "__main__":
app = wx.App()
MyWin(None, 'Gauge')
app.MainLoop()

14. wx.ScrollBar(滚动条)
wx.ScrollBar 是一个表示水平或垂直滚动条的控件。
这个滚动条和某些窗口自动增加的两个滚动条是有区别的,但是它们处理事件的方式是一样的。
滚动条属性:
- 范围:指的是和这个滚动条绑定的窗口的逻辑单位的大小。比如一个表格有20行,那么和这个表格绑定的滚动条的范围就可以设置为20。
- 滑块大小:通常用来反映当前可视部分的大小,还用表格来作为例子,如果因为窗口大小的原因表格只能显示5行,那么滚动条的滑块大小就可以设置成5。如果滑块大小大于或者等于范围,在多数平台上,这个滚动条将自动隐藏。
- 页大小:指的是当滚动条执行翻页命令时需要滚动的单位数目。
- 当前位置:指的是滑块当前所处的位置。
窗口样式:
- wx.SB_HORIZONTAL:设置为水平滚动条。
- wx.SB_VERTICAL:设置为垂直滚动条。
可发出事件:
- EVT_SCROLL:处理所有滚动事件。
- EVT_SCROLL_TOP:处理wx.EVT_SCROLL_TOP滚动到顶部或最左侧(最小)位置事件。
- EVT_SCROLL_BOTTOM:处理wx.EVT_SCROLL_BOTTOM滚动到底部或最右边(最大)位置事件。
- EVT_SCROLL_LINEUP:处理wx.EVT_SCROLL_LINEUP滚动到顶部或者左侧事件。
- EVT_SCROLL_LINEDOWN:处理wx.EVT_SCROLL_LINEDOW滚动到底部或者右侧事件。
- EVT_SCROLL_PAGEUP:按页步长值处理wx.EVT_SCROLL_PAGEUP滚动到顶部或者左侧事件。
- EVT_SCROLL_PAGEDOWN:按页步长值处理wx.EVT_SCROLL_PAGEDOWN滚动到底部或者右侧事件。
- EVT_SCROLL_THUMBTRACK:处理wx.EVT_SCROLL_THUMBTRACK thumbtrack事件(当用户拖动thumbtrack时发送的频繁事件)。
- EVT_SCROLL_THUMBRELEASE:处理wxEVT_SCROLL_THUMBRELEASE thumb释放事件。
- EVT_SCROLL_CHANGED:处理wx.EVT_SCROLL_CHANGED滚动结束事件(仅MSW)。
- EVT_COMMAND_SCROLL:同EVT_SCROLL。
- EVT_COMMAND_SCROLL_TOP: 同EVT_SCROLL_TOP。
- EVT_COMMAND_SCROLL_BOTTOM:同EVT_SCROLL_BOTTOM。
- EVT_COMMAND_SCROLL_LINEUP:同EVT_SCROLL_LINEUP。
- EVT_COMMAND_SCROLL_LINEDOWN:同EVT_SCROLL_LINEDOWN。
- EVT_COMMAND_SCROLL_PAGEUP:同 EVT_SCROLL_PAGEUP。
- EVT_COMMAND_SCROLL_PAGEDOWN:同EVT_SCROLL_PAGEDOWN。
- EVT_COMMAND_SCROLL_THUMBTRACK:同EVT_SCROLL_THUMBTRACK。
- EVT_COMMAND_SCROLL_THUMBRELEASE:同EVT_SCROLL_THUMBRELEASE。
- EVT_COMMAND_SCROLL_CHANGED:同EVT_SCROLL_THUMBRELEASE。
常用方法:
- GetPageSize(self):获得页大小,通常这个大小和滑块大小相同。
- GetRange(self):获得滚动条值的范围。
- GetThumbPosition(self):获得滑块当前的位置。
- GetThumbSize(self):获得滑块的尺寸。
- IsVertical(self):对于设置了垂直样式的滚动条返回True。
- SetScrollbar(self, position, thumbSize, range, pageSize, refresh=True):用来设置滚动条的所有属性。比如滑块位置(逻辑单位),滑块大小,范围,页大小以及一个可选的bool参数refresh用来指示是否立即更新滚动条的显示。
- SetThumbPosition(self, viewStart):设置滑块当前的位置。
python
import wx
class MyWin(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title = title)
self.SetTitle(title=title)
panel = wx.Panel(self)
panel.SetBackgroundColour(wx.Colour(192, 192, 192))
# 垂直滚动条
sb_v = wx.ScrollBar(panel, pos=(20, 20), size=(-1, 150), style=wx.SB_VERTICAL)
sb_v.SetScrollbar(0, 0, 200, 10)
sb_v.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnScrollV)
sb_v.Bind(wx.EVT_SCROLL_LINEUP, self.OnScrollV)
sb_v.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnScrollV)
sb_v.Bind(wx.EVT_SCROLL_PAGEUP, self.OnScrollV)
sb_v.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnScrollV)
# 下边的值
self.info_v = wx.StaticText(panel, pos = (20, 170), size=(100, -1))
self.info_v.SetLabel(str(sb_v.GetThumbPosition()))
# 水平滚动条
sb_h = wx.ScrollBar(panel, pos = (100, 40), size=(200, -1))
sb_h.SetScrollbar(100, 10, 200, 10)
sb_h.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnScrollH)
sb_h.Bind(wx.EVT_SCROLL_LINEUP, self.OnScrollH)
sb_h.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnScrollH)
sb_h.Bind(wx.EVT_SCROLL_PAGEUP, self.OnScrollH)
sb_h.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnScrollH)
# 右边的值
self.info_h = wx.StaticText(panel, pos = (300, 40), size=(100,-1))
self.info_h.SetLabel(str(sb_h.GetThumbPosition()))
self.Centre()
def OnScrollV(self, e):
sb = e.GetEventObject()
pos = sb.GetThumbPosition()
self.info_v.SetLabel(str(pos))
def OnScrollH(self, e):
sb = e.GetEventObject()
pos = sb.GetThumbPosition()
self.info_h.SetLabel(str(pos))
if __name__ == '__main__':
app = wx.App()
window = MyWin(None, title="ScrollBar")
window.Show()
app.MainLoop()

参考:
https://wintel.blog.csdn.net/article/details/130898054?spm=1001.2014.3001.5502