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.AppMyApp 类,用于初始化应用程序。然后,我们创建了一个继承自 wx.FrameMyFrame 类,用于创建应用程序的窗口。

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