Logo

郎哥编程

一个完整的窗体应用程序示例

2019-07-06 645

前面我们创建了一个简单的窗体应用程序,本课我们将创建一个包含菜单栏和状态条的窗口,并且在窗口内输出“Hello World”信息。

import wx
#自定义窗口类,继承于Frame
class HelloFrame(wx.Frame):
    def __init__(self, *args, **kw):
        # 调用父类的 __init__ 方法
        super(HelloFrame, self).__init__(*args, **kw)
 
        # 创建Panel对象
        pnl = wx.Panel(self)
 
        # 创建一个静态文本对象
        st = wx.StaticText(pnl, label="Hello World!", pos=(25,25))
        # 获取静态文本对象的字体对象
        font = st.GetFont()
        # 修改静态文本对象字体尺寸
        font.PointSize += 10
        # 加粗字体
        font = font.Bold()
        # 设置字体
        st.SetFont(font)
 
        # 创建菜单条
        self.makeMenuBar()
 
        # 创建状态条
        self.CreateStatusBar()
        # 创建状态条显示的文本
        self.SetStatusText("Welcome to wxPython!")
 
 
    def makeMenuBar(self):
        """
        菜单栏由菜单组成,菜单由菜单项组成
 
        本方法创建菜单栏,在菜单栏中添加菜单,在菜单中添加菜单项
        绑定菜单项单击事件
     
        """
 
        # 创建File菜单
        fileMenu = wx.Menu()
        # 使用 "\t..." 定义与菜单项相关联的快捷键
        helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H",
                "Help string shown in status bar for this menu item")
        #添加分隔符
        fileMenu.AppendSeparator()
        # 添加退出菜单项,可以直接使用wx已设定的菜单项ID
        exitItem = fileMenu.Append(wx.ID_EXIT)
 
        # 创建help菜单
        helpMenu = wx.Menu()
        #添加About菜单项,同样可以直接使用wx已设定的菜单项ID
        aboutItem = helpMenu.Append(wx.ID_ABOUT)
 
       
        # 创建菜单栏
        menuBar = wx.MenuBar()
        # 添加File菜单
        menuBar.Append(fileMenu, "&File")
        # 添加Hel菜单
        menuBar.Append(helpMenu, "&Help")
 
        # 设置菜单栏到窗口
        self.SetMenuBar(menuBar)
 
        #绑定菜单项单击事件
        self.Bind(wx.EVT_MENU, self.OnHello, helloItem)
        self.Bind(wx.EVT_MENU, self.OnExit,  exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)
 
     #菜单项exitItem事件处理方法
    def OnExit(self, event):
        """Close the frame, terminating the application."""
        self.Close(True)
 
    #菜单项helloItem事件处理方法
    def OnHello(self, event):
        """Say hello to the user."""
        wx.MessageBox("Hello again from wxPython")
 
    #菜单项aboutItem事件处理方法
    def OnAbout(self, event):
        """Display an About Dialog"""
        wx.MessageBox("This is a wxPython Hello World sample",
                      "About Hello World 2",
                      wx.OK|wx.ICON_INFORMATION)
 
 
if __name__ == '__main__':
    app = wx.App()
    frm = HelloFrame(None, title='Hello World 2')
    frm.Show()
    app.MainLoop()


 image.png        

图 1 Hello World 2窗体应用程序

运行Hello World 2窗体应用程序,用鼠标单击File菜单或Help菜单,会列出相应的菜单项,用鼠标单击菜单项,窗体会弹出对话框。

窗体中的菜单、状态条、以及展示文字的区域都是窗口内的控件。控件有自己的属性和行为,可以与用户进行交互,可以接收窗体发送的消息和事件。在Python中,控件就是一个Python类,创建控件就是实例化控件类。

wx.Panel控件在窗体中是一个矩形区域的子窗口(也称为面板),在该面板中可以放置其它控件。在案例代码中,pnl是wx.Panel的实例化对象,wx.StaticText的实例化对象st被放置在pnl内,st的显示位置被限制在pnl内。

wx.StaticText控件用于显示单行或多行文本内容,当控件尺寸不足以显示所有文本内容时,它采用省略号(“…”)替换部分文本,并格式化标记。它有三种文字对齐方式:

wx.ALIGN_LEFT:文本左对齐

wx.ALIGN_RIGHT:文本右对齐

wx.ALIGN_CENTRE_HORIZONTAL:文本水平居中

wx.StaticText类的父类是wx.Control类,它的类层次结构图如下:

image.png


图 2 wx.StaticText类层次结构图

在案例代码中,wx.StaticText的构造函数传入了三个参数,第一参数是wx.Panel控件的实例化对象pnl,第二个参数是要设置的文本内容,第三个参数是设置在pnl控件内的起始位置,它是一个wx.Point对象。构造函数返回的实例化对象赋值给st变量。

st调用wx.StaticText的GetFont方法获取wx.Font类的实例化对象,wx.Font类主要用于设置文字的显示外观,如设置显示文字的字体、字号、样式等属性。

wx.Menu控件用于管理菜单项,可以添加和删除菜单项。添加菜单项使用Append或Insert方法,删除菜单项使用Delete或Remove方法。Menu类可以添加三种类型的菜单项:Append方法添加标准菜单项;AppendRadioItem方法添加单选菜单项;AppendCheckItem方法添加多选菜单项。每个菜单项的分隔符使用AppendSeparator方法添加。当菜单项还包含子菜单时,可以使用AppendSubMenu添加子菜单。

在一些情况下,菜单项可能会被置灰,以表示该菜单项暂时不能使用。在这种情况下,可以使用Enable方法来置灰或取消置灰,也可以使用IsEnabled方法来判断该菜单项是否被置灰。

wx.Menu类的父类是wx.EvtHandler类,它的类层次结构图如下:

image.png


图 3 wx.Menu类层次结构图

案例代码中的Bind方法是wx.EvtHandler的方法,wx.Frame类继承了wx.EvtHandler类。因此可以调用Bind方法将控件发生的事件绑定到事件处理方法上。例如案例代码:

self.Bind(wx.EVT_MENU, self.OnHello, helloItem)

将helloItem菜单项控件发生的菜单事件绑定到OnHello方法上,该方法被定义在HelloFrame窗体类中,当用户单击helloItem菜单项时,HelloFrame窗体类的OnHello方法将会被调用。

在后面的课程中,我们将会讨论wxPython提供的更多控件。

wxPython类的更多详细信息请参考官方API文档

官方文档地址:https://docs.wxpython.org


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论