wxPython 写一个 app 界面
引言
wxPython 是一个用于创建跨平台图形用户界面 (GUI) 的 Python 库。它基于 wxWidgets,一个用 C++ 编写的开源库。wxPython 提供了一套丰富的 API,使开发者能够快速创建漂亮且功能丰富的应用程序界面。
本文将向您展示如何使用 wxPython 创建一个简单的 app 界面,并且使用一些常见控件和功能。
安装 wxPython
在开始之前,我们需要安装 wxPython。您可以使用 pip 命令来安装它:
pip install wxPython
注意:wxPython 的安装可能因操作系统和 Python 版本而有所不同,请根据您的具体情况进行安装。
创建一个基本的 wxPython app
首先,让我们创建一个基本的 wxPython 应用程序。
import wx
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, title='My App')
frame.Show(True)
return True
class MyFrame(wx.Frame):
def __init__(self, parent, title):
super(MyFrame, self).__init__(parent, title=title, size=(300, 200))
panel = wx.Panel(self)
self.Bind(wx.EVT_CLOSE, self.OnClose)
def OnClose(self, event):
self.Destroy()
app = MyApp()
app.MainLoop()
在上面的代码中,我们首先创建了一个继承自 wx.App
的 MyApp
类,用于初始化应用程序。然后,我们创建了一个继承自 wx.Frame
的 MyFrame
类,用于创建应用程序的窗口。
在 OnInit
方法中,我们实例化了 MyFrame
类,并显示出来。在 MyFrame
类中,我们创建了一个面板,并绑定了关闭窗口的事件。
最后,我们创建了一个 MyApp
实例,并调用 MainLoop
方法来启动应用程序的主事件循环。
添加控件和事件处理
现在,让我们向应用程序界面添加一些常见的控件,并处理一些基本的事件。
import wx
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, title='My App')
frame.Show(True)
return True
class MyFrame(wx.Frame):
def __init__(self, parent, title):
super(MyFrame, self).__init__(parent, title=title, size=(300, 200))
panel = wx.Panel(self)
# 创建一个按钮
self.button = wx.Button(panel, label='Click Me')
self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)
# 创建一个文本框
self.text = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
# 创建一个复选框
self.checkbox = wx.CheckBox(panel, label='Check Me')
self.Bind(wx.EVT_CHECKBOX, self.OnCheck, self.checkbox)
# 创建一个下拉列表框
choices = ['Option 1', 'Option 2', 'Option 3']
self.choice = wx.Choice(panel, choices=choices)
self.Bind(wx.EVT_CHOICE, self.OnChoice, self.choice)
# 创建一个滑动条
self.slider = wx.Slider(panel, value=50, minValue=0, maxValue=100)
self.Bind(wx.EVT_SLIDER, self.OnSlider, self.slider)
# 创建一个标签
self.label = wx.StaticText(panel, label='Slider Value: 50')
# 创建一个饼状图
self.pie = """
pie
"Option 1": 30
"Option 2": 40
"Option 3": 30
"""
# 创建一个类图
self.class_diagram = """
classDiagram
class MyApp
class MyFrame
MyApp <|-- MyFrame
"""
# 创建一个垂直布局的 sizer
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.button, 0, wx.ALIGN_CENTER)
sizer.Add(self.text, 1, wx.EXPAND)
sizer.Add(self.checkbox, 0, wx.ALIGN_CENTER)
sizer.Add(self.choice, 0, wx.ALIGN_CENTER)
sizer.Add(self.slider, 0, wx.ALIGN_CENTER)
sizer.Add(self.label, 0, wx.ALIGN_CENTER)
panel.SetSizerAndFit(sizer)
self.Bind(wx.EVT_CLOSE, self.OnClose)
def OnClick(self, event):
self.text.AppendText('Button Clicked\n')
def OnCheck(self, event):
checked = self.checkbox.GetValue()