wxPython 快速入门教程

5 Sleep 3天前 82次点击

留下做参考。
 

# wxPython 快速入门教程

## 1. 安装 wxPython

```python
# 安装 wxPython
# pip install wxPython
```

---

## 2. 第一个窗口

```python
# 导入 wxPython 模块
import wx

# 创建应用对象(程序引擎)
app = wx.App()

# 创建窗口(父窗口为 None,自动分配 ID,标题为 "First Window")
frame = wx.Frame(None, wx.ID_ANY, "First Window")

# 显示窗口
frame.Show()

# 进入主事件循环(保持窗口运行)
app.MainLoop()
```

---

## 3. 设置窗口大小和位置

```python
# 设置窗口大小和位置
import wx

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "Window Size and Position")

# 设置窗口尺寸(宽400,高300)
frame.SetSize(400, 300)

# 设置窗口位置(距离屏幕左上角 (200, 200))
frame.SetPosition((200, 200))

frame.Show()
app.MainLoop()
```

---

## 4. 按钮与事件绑定

```python
# 按钮点击弹出消息框
import wx

# 定义按钮点击事件处理函数
def on_click(event):
    wx.MessageBox("Button clicked!", "Info")

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "Button Demo")

# 创建面板(用于放置控件)
panel = wx.Panel(frame)

# 创建按钮,标签为 "Click",位置 (50, 50)
btn = wx.Button(panel, label="Click", pos=(50, 50))

# 绑定按钮点击事件
btn.Bind(wx.EVT_BUTTON, on_click)

frame.Show()
app.MainLoop()
```

---

## 5. 多个按钮独立事件

```python
# 两个按钮各自响应不同消息
import wx

def on_button1(event):
    wx.MessageBox("Button 1 Clicked", "Info")

def on_button2(event):
    wx.MessageBox("Button 2 Clicked", "Info")

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "Multiple Buttons")
panel = wx.Panel(frame)

# 创建两个按钮,位置不同
btn1 = wx.Button(panel, label="Button 1", pos=(50, 50))
btn2 = wx.Button(panel, label="Button 2", pos=(50, 100))

# 分别绑定不同的事件处理函数
btn1.Bind(wx.EVT_BUTTON, on_button1)
btn2.Bind(wx.EVT_BUTTON, on_button2)

frame.Show()
app.MainLoop()
```

---

## 6. 文本框(TextCtrl)

```python
# 创建文本框用于输入
import wx

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "TextCtrl Demo")
panel = wx.Panel(frame)

# 创建文本框,位置 (50, 50),宽200,高25
text = wx.TextCtrl(panel, pos=(50, 50), size=(200, 25))

frame.Show()
app.MainLoop()
```

---

## 7. 静态文本(StaticText)

```python
# 显示不可编辑的标签
import wx

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "StaticText Demo")
panel = wx.Panel(frame)

# 创建不可编辑的标签
label = wx.StaticText(panel, label="Hello wxPython", pos=(50, 50))

frame.Show()
app.MainLoop()
```

---

## 8. 动态改变标签文字

```python
# 点击按钮改变静态文本内容
import wx

# 点击按钮后修改标签文字
def change_label(event):
    label.SetLabel("Button Clicked")

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "Change Label")
panel = wx.Panel(frame)

# 初始标签
label = wx.StaticText(panel, label="Hello", pos=(50, 50))

# 按钮
btn = wx.Button(panel, label="Click Me", pos=(50, 80))
btn.Bind(wx.EVT_BUTTON, change_label)

frame.Show()
app.MainLoop()
```

---

## 9. 消息框(MessageBox)

```python
# 弹出消息框
import wx

app = wx.App()

# 弹出消息框,内容为 "Hello, this is a message box",标题 "Info"
wx.MessageBox("Hello, this is a message box", "Info")

app.MainLoop()
```

---

## 10. 复选框(CheckBox)

```python
# 复选框状态改变时弹出提示
import wx

def on_check(event):
    # 根据复选框是否被选中弹出不同消息
    if check.IsChecked():
        wx.MessageBox("CheckBox is checked", "Info")
    else:
        wx.MessageBox("CheckBox is unchecked", "Info")

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "CheckBox Demo")
panel = wx.Panel(frame)

# 创建复选框
check = wx.CheckBox(panel, label="I Agree", pos=(50, 50))
check.Bind(wx.EVT_CHECKBOX, on_check)

frame.Show()
app.MainLoop()
```

---

## 11. 单选按钮(RadioButton)

```python
# 单选按钮组,获取选中项
import wx

def on_radio(event):
    # 获取当前选中的单选按钮标签
    selected = radio1.GetLabel() if radio1.GetValue() else radio2.GetLabel()
    wx.MessageBox(f"You selected {selected}", "Info")

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "RadioButton Demo")
panel = wx.Panel(frame)

# 创建两个单选按钮,第一个使用 wx.RB_GROUP 表示分组开始
radio1 = wx.RadioButton(panel, label="Option 1", pos=(50, 50), style=wx.RB_GROUP)
radio2 = wx.RadioButton(panel, label="Option 2", pos=(50, 80))

# 绑定事件(两个按钮绑定同一个处理函数)
radio1.Bind(wx.EVT_RADIOBUTTON, on_radio)
radio2.Bind(wx.EVT_RADIOBUTTON, on_radio)

frame.Show()
app.MainLoop()
```

---

## 12. 组合框(ComboBox)

```python
# 下拉选择,显示选中项
import wx

def on_combo(event):
    # 获取当前选中的条目
    selected = combo.GetValue()
    wx.MessageBox(f"You selected {selected}", "Info")

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "ComboBox Demo")
panel = wx.Panel(frame)

options = ["Python", "Java", "C++", "Go"]
combo = wx.ComboBox(panel, choices=options, pos=(50, 50))
combo.Bind(wx.EVT_COMBOBOX, on_combo)

frame.Show()
app.MainLoop()
```

---

## 13. 滑块(Slider)

```python
# 滑块拖动时实时显示数值
import wx

def on_slider(event):
    # 获取滑块当前数值,并更新标签显示
    value = slider.GetValue()
    label.SetLabel(str(value))

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "Slider Demo")
panel = wx.Panel(frame)

# 滑块,范围 0-100,初始值 0
slider = wx.Slider(panel, value=0, minValue=0, maxValue=100, pos=(50, 50), size=(200, -1))

# 用于显示当前数值的静态文本
label = wx.StaticText(panel, label="0", pos=(50, 100))

slider.Bind(wx.EVT_SLIDER, on_slider)

frame.Show()
app.MainLoop()
```

---

## 14. 列表框(ListBox)

```python
# 列表选择,显示选中项
import wx

def on_listbox(event):
    # 获取当前选中的列表项
    selected = listbox.GetStringSelection()
    wx.MessageBox(f"You selected {selected}", "Info")

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "ListBox Demo")
panel = wx.Panel(frame)

options = ["Apple", "Banana", "Orange", "Grape"]
listbox = wx.ListBox(panel, choices=options, pos=(50, 50), size=(100, 100))
listbox.Bind(wx.EVT_LISTBOX, on_listbox)

frame.Show()
app.MainLoop()
```

---

## 15. 菜单栏(MenuBar)

```python
# 添加文件菜单,带退出功能
import wx

def on_exit(event):
    # 关闭窗口,退出应用
    frame.Close()

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "MenuBar Demo")

# 创建菜单栏
menubar = wx.MenuBar()

# 创建文件菜单
file_menu = wx.Menu()
exit_item = file_menu.Append(wx.ID_EXIT, "Exit")   # 添加“退出”项
menubar.Append(file_menu, "File")                  # 将文件菜单添加到菜单栏

frame.SetMenuBar(menubar)

# 绑定退出菜单项的点击事件
frame.Bind(wx.EVT_MENU, on_exit, exit_item)

frame.Show()
app.MainLoop()
```

---

## 16. 网格布局(GridSizer)

```python
# 使用网格布局器排列按钮
import wx

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "GridSizer Demo")
panel = wx.Panel(frame)

# 创建 2x2 网格布局器,单元格间距 10 像素
sizer = wx.GridSizer(rows=2, cols=2, vgap=10, hgap=10)

# 添加四个按钮
for i in range(1, 5):
    btn = wx.Button(panel, label=f"Button {i}")
    sizer.Add(btn, 0, wx.EXPAND)

# 将布局器应用到面板
panel.SetSizer(sizer)

frame.Show()
app.MainLoop()
```

---

## 17. Box布局(BoxSizer)

```python
# 使用垂直和水平布局器嵌套
import wx

app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "BoxSizer Demo")
panel = wx.Panel(frame)

# 创建垂直和水平布局器
vbox = wx.BoxSizer(wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)

# 创建三个按钮
btn1 = wx.Button(panel, label="Button 1")
btn2 = wx.Button(panel, label="Button 2")
btn3 = wx.Button(panel, label="Button 3")

# 将前两个按钮放入水平布局器(等比例扩展,四周留5像素边距)
hbox.Add(btn1, 1, wx.EXPAND | wx.ALL, 5)
hbox.Add(btn2, 1, wx.EXPAND | wx.ALL, 5)

# 将水平布局器放入垂直布局器
vbox.Add(hbox, 1, wx.EXPAND | wx.ALL, 5)
# 将第三个按钮放入垂直布局器
vbox.Add(btn3, 1, wx.EXPAND | wx.ALL, 5)

panel.SetSizer(vbox)

frame.Show()
app.MainLoop()
```

---

## 总结

通过以上示例,我们已掌握了 wxPython 的基础知识:

- 创建窗口、设置大小位置
- 常用控件:按钮、文本框、静态文本、复选框、单选按钮、组合框、滑块、列表框
- 事件绑定与交互
- 菜单栏
- 布局管理器:GridSizer 和 BoxSizer

利用这些内容,我们可以开始构建功能完整的桌面应用程序。如果需要进一步深入学习,可以查阅 wxPython 官方文档。

共 1 条评论
毁灭 2天前
0 

收藏

添加一条新评论

登录后可以发表评论 去登录