前面我们创建了一个简单的窗体应用程序,本课我们将创建一个包含菜单栏和状态条的窗口,并且在窗口内输出“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()
图 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类,它的类层次结构图如下:

图 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类,它的类层次结构图如下:

图 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