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()