wxPython基础组件使用
wxPython提供了丰富的UI控件,这些控件是构建图形用户界面的基础。本章将介绍一些最常用的基础组件及其使用方法。
应用程序框架
在使用wxPython创建任何GUI应用之前,都需要创建应用程序对象和主窗口框架:
Python
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None, title="基础组件示例")
self.panel = wx.Panel(self)
self.setup_ui()
def setup_ui(self):
# 在这里添加UI组件
pass
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame()
frame.Show()
return True
if __name__ == '__main__':
app = MyApp()
app.MainLoop()
文本控件 (wx.TextCtrl)
文本控件用于显示和编辑文本,可以是单行或多行:
Python
# 单行文本控件
text_ctrl = wx.TextCtrl(panel, value="请输入文本")
# 多行文本控件
multi_text_ctrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE, size=(300, 100))
# 密码输入框
password_ctrl = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
按钮控件 (wx.Button)
按钮是最常用的交互控件,用户点击按钮可以触发相应的操作:
Python
# 创建普通按钮
button = wx.Button(panel, label="点击我")
# 创建带ID的按钮
ok_button = wx.Button(panel, id=wx.ID_OK, label="确定")
# 创建默认按钮(回车触发)
default_button = wx.Button(panel, label="默认按钮")
default_button.SetDefault()
标签控件 (wx.StaticText)
标签控件用于显示静态文本信息:
Python
# 创建基本标签
label = wx.StaticText(panel, label="这是一个标签")
# 带样式的标签
styled_label = wx.StaticText(panel, label="粗体标签")
font = styled_label.GetFont()
font.Bold()
styled_label.SetFont(font)
复选框 (wx.CheckBox)
复选框允许用户进行多项选择:
Python
# 创建复选框
checkbox = wx.CheckBox(panel, label="启用选项")
# 设置初始状态
checkbox.SetValue(True) # 选中
checkbox.SetValue(False) # 未选中
# 检查状态
if checkbox.IsChecked():
print("复选框被选中")
单选按钮 (wx.RadioButton)
单选按钮用于在一组选项中只能选择一个:
Python
# 创建单选按钮组
radio1 = wx.RadioButton(panel, label="选项1", style=wx.RB_GROUP)
radio2 = wx.RadioButton(panel, label="选项2")
radio3 = wx.RadioButton(panel, label="选项3")
# 检查选中状态
if radio1.GetValue():
print("选项1被选中")
组合框 (wx.ComboBox)
组合框结合了文本框和下拉列表的功能:
Python
# 创建组合框
choices = ["苹果", "香蕉", "橙子", "葡萄"]
combo_box = wx.ComboBox(panel, choices=choices, style=wx.CB_DROPDOWN)
# 设置默认值
combo_box.SetStringSelection("苹果")
# 获取选中值
selected_item = combo_box.GetStringSelection()
列表框 (wx.ListBox)
列表框用于显示项目列表,用户可以选择其中的一项或多项:
Python
# 创建列表框
items = ["项目1", "项目2", "项目3", "项目4"]
list_box = wx.ListBox(panel, choices=items, style=wx.LB_SINGLE)
# 获取选中项
selection = list_box.GetSelection()
if selection != wx.NOT_FOUND:
selected_text = list_box.GetString(selection)
完整示例
下面是一个包含多个基础组件的完整示例:
Python
import wx
class BasicComponentsFrame(wx.Frame):
def __init__(self):
super().__init__(None, title="基础组件示例", size=(500, 400))
self.panel = wx.Panel(self)
self.setup_ui()
def setup_ui(self):
# 创建垂直布局
main_sizer = wx.BoxSizer(wx.VERTICAL)
# 标题
title = wx.StaticText(self.panel, label="基础组件演示")
title_font = title.GetFont()
title_font.PointSize += 4
title_font = title_font.Bold()
title.SetFont(title_font)
main_sizer.Add(title, 0, wx.ALL | wx.CENTER, 10)
# 文本输入
text_label = wx.StaticText(self.panel, label="姓名:")
self.text_ctrl = wx.TextCtrl(self.panel, value="请输入您的姓名")
text_sizer = wx.BoxSizer(wx.HORIZONTAL)
text_sizer.Add(text_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
text_sizer.Add(self.text_ctrl, 1, wx.EXPAND)
main_sizer.Add(text_sizer, 0, wx.ALL | wx.EXPAND, 10)
# 复选框
self.checkbox = wx.CheckBox(self.panel, label="同意用户协议")
main_sizer.Add(self.checkbox, 0, wx.ALL, 10)
# 单选按钮组
radio_sizer = wx.BoxSizer(wx.HORIZONTAL)
radio_sizer.Add(wx.StaticText(self.panel, label="性别:"), 0,
wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 10)
self.radio_male = wx.RadioButton(self.panel, label="男", style=wx.RB_GROUP)
self.radio_female = wx.RadioButton(self.panel, label="女")
radio_sizer.Add(self.radio_male, 0, wx.RIGHT, 10)
radio_sizer.Add(self.radio_female, 0)
main_sizer.Add(radio_sizer, 0, wx.ALL, 10)
# 组合框
combo_sizer = wx.BoxSizer(wx.HORIZONTAL)
combo_sizer.Add(wx.StaticText(self.panel, label="城市:"), 0,
wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 10)
cities = ["北京", "上海", "广州", "深圳", "杭州"]
self.combo_box = wx.ComboBox(self.panel, choices=cities,
style=wx.CB_DROPDOWN)
self.combo_box.SetStringSelection("北京")
combo_sizer.Add(self.combo_box, 1, wx.EXPAND)
main_sizer.Add(combo_sizer, 0, wx.ALL | wx.EXPAND, 10)
# 列表框
list_label = wx.StaticText(self.panel, label="兴趣爱好:")
hobbies = ["阅读", "音乐", "电影", "旅行", "运动"]
self.list_box = wx.ListBox(self.panel, choices=hobbies, style=wx.LB_EXTENDED)
main_sizer.Add(list_label, 0, wx.ALL, 10)
main_sizer.Add(self.list_box, 1, wx.ALL | wx.EXPAND, 10)
# 按钮
button_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.ok_button = wx.Button(self.panel, wx.ID_OK, "确定")
self.cancel_button = wx.Button(self.panel, wx.ID_CANCEL, "取消")
button_sizer.Add(self.ok_button, 0, wx.RIGHT, 10)
button_sizer.Add(self.cancel_button, 0)
main_sizer.Add(button_sizer, 0, wx.ALL | wx.CENTER, 10)
# 绑定事件
self.ok_button.Bind(wx.EVT_BUTTON, self.on_ok)
self.cancel_button.Bind(wx.EVT_BUTTON, self.on_cancel)
# 设置主布局
self.panel.SetSizer(main_sizer)
def on_ok(self, event):
name = self.text_ctrl.GetValue()
if not name or name == "请输入您的姓名":
wx.MessageBox("请输入姓名!", "提示", wx.OK | wx.ICON_INFORMATION)
return
if not self.checkbox.IsChecked():
wx.MessageBox("请同意用户协议!", "提示", wx.OK | wx.ICON_INFORMATION)
return
gender = "男" if self.radio_male.GetValue() else "女"
city = self.combo_box.GetStringSelection()
hobbies = [self.list_box.GetString(i) for i in self.list_box.GetSelections()]
message = f"姓名: {name}\n性别: {gender}\n城市: {city}\n爱好: {', '.join(hobbies)}"
wx.MessageBox(message, "提交信息", wx.OK | wx.ICON_INFORMATION)
def on_cancel(self, event):
self.Close()
class BasicComponentsApp(wx.App):
def OnInit(self):
frame = BasicComponentsFrame()
frame.Show()
return True
if __name__ == '__main__':
app = BasicComponentsApp()
app.MainLoop()