第3章

wxPython





3.1wxPython的安装
由于wxPython不是Python官方提供的图形用户界面开发工具包,所以在使用wxPython之前,需要安装wxPython。
安装wxPython的方法很简单,打开“命令提示符”,并输入命令pip install wxpython即可。
在完成安装之后,需要引入该包才可以正常使用wxPython进行编程,需要注意的是,引入的包名是wx,而不是wxpython,示例代码如下: 




#资源包\Code\chapter3\3.1\0301.py

import wx



3.2wxPython的基本要素
在正式开始学习wxPython之前,首先要了解一下wxPython的5个基本要素,其分别为应用程序、窗口、控件、布局管理器和事件处理,之后的学习内容也都是紧紧围绕这5个基本要素展开的。
3.3应用程序
在wxPython中,应用程序主要用于管理主事件循环,主事件循环是wxPython驱动程序的动力,如果没有应用程序,wxPython的程序将无法正常运行。
1. 创建应用程序对象
可以通过wx模块中的App类创建应用程序对象,用于完成应用程序的创建,其语法格式如下:  




App()


2. 应用程序对象的相关方法
应用程序对象的相关方法为MainLoop()方法,主要用于主事件循环,其语法格式如下: 




MainLoop()


3. 创建应用程序
创建应用程序有两种方式,分别为使用App类和App类的子类。
1) 使用App类创建应用程序
示例代码如下: 




#资源包\Code\chapter3\3.3\0302.py

import wx

#创建应用程序

app = wx.App()

#主事件循环

app.MainLoop()



2) 使用App类的子类创建应用程序
需要注意的是,App类中具有两种方法,分别为OnInit()方法和OnExit()方法,App类的子类必须重写这两种方法,其中,OnInit()方法表示应用程序进入时所调用的方法,而OnExit()方法表示应用程序退出时所调用的方法,示例代码如下: 




#资源包\Code\chapter3\3.3\0303.py

import wx

class App(wx.App):

def OnInit(self):

return True

def OnExit(self):

return False

if __name__ == '__main__':

app = App()

app.MainLoop()



3.4窗口
可以通过Window类的子类来创建各种窗口,包括框架(Frame类)、内容面板(Panel类)、菜单栏(MenuBar类)和分隔窗口(SplitterWindow类)等。
3.4.1框架(Frame类)
在wxPython中,框架主要用于管理窗体的相关控件,并呈现给用户。
1. 创建框架对象
可以通过wx模块中的Frame类创建框架对象,用于完成框架的创建,其语法格式如下: 




Frame(parent, id, title, pos, size, style, name)


其中,参数parent表示框架的父窗口,该值一般为None; 参数id表示窗口标识符; 参数title表示框架的标题; 参数pos表示框架的位置; 参数size表示框架的尺寸; 参数style表示框架的类型; 参数name表示框架的名称。
在上面的参数中有一个重要的概念,即窗口标识符,窗口标识符指的是在事件中用于唯一确定窗口的标识,该标识既可以为常量,也可以为该常量的值。
创建窗口标识符有以下3种方法。
1) 自动创建窗口标识符
通过常量ID_ANY,或者其对应的值-1,即可使wxPython自动创建窗口标识符。通常情况下,在不需要修改子窗口或控件状态的时候,一般让wxPython自动创建窗口标识符,例如创建一个不需要改变的静态文本控件。
2) 使用标准窗口标识符
wxPython中提供了标准窗口标识符,这些窗口标识符的范围在常量ID_LOWEST和常量ID_HIGHEST之间,即4999~5999,常用的窗口标识符如表31所示。


表31常用的窗口标识符



常量值描述

ID_OPEN
5000
打开(O)...
ID_CLOSE
5001
关闭
ID_NEW
5002
新建(N)
ID_SAVE
5003
保存(S)
ID_SAVEAS
5004
另存为(A)...
ID_EXIT
5006
退出(Q)
ID_UNDO
5007
撤销(U)
ID_REDO
5008
恢复(R)
ID_HELP
5009
帮助(H)
ID_PRINT
5010
打印(P)...
ID_PREVIEW
5013
打印预览(W)...
ID_ABOUT
5014
关于(A)
ID_EDIT
5030
编辑(E)
ID_CUT
5031
剪切(t)
ID_COPY
5032
复制(C)
ID_PASTE
5033
粘贴(P)
ID_CLEAR
5034
清除(C)
ID_FIND
5035
Find...
ID_SELECTALL
5037
全部选择(A)
ID_DELETE
5038
删除(D)
ID_REPLACE
5039
Replace...
ID_PROPERTIES
5041
属性(P)
ID_FILE
5050
文件(F)续表


常量值描述

ID_OK
5100
确认
ID_CANCEL
5101
取消
ID_APPLY
5102
应用(A)
ID_YES
5103
是(Y)
ID_NO
5104
否(N)
ID_FORWARD
5106
前进(F)
ID_BACKWARD
5107
返回(B)
ID_UP
5120
向上(U)
ID_DOWN
5121
向下(D)
ID_HOME
5122
Home(H)
ID_REFRESH
5123
刷新
ID_STOP
5124
停止(S)
ID_INDEX
5125
索引(I)
ID_BOLD
5126
粗体(B)
ID_ITALIC
5127
斜体(I)
ID_JUSTIFY_CENTER
5128
居中
ID_JUSTIFY_FILL
5129
分散对齐
ID_JUSTIFY_RIGHT
5130
右对齐
ID_JUSTIFY_LEFT
5131
左对齐
ID_UNDERLINE
5132
下画线
ID_INDENT
5133
缩进
ID_UNINDENT
5134
取消缩进(U)
ID_ZOOM_100
5135
实际大小(A)
ID_ZOOM_FIT
5136
缩放以适应窗口(F)
ID_ZOOM_IN
5137
放大(I)
ID_ZOOM_OUT
5138
缩小(O)
ID_UNDELETE
5139
取消删除
ID_REVERT_TO_SAVED
5140
还原为上次保存的文件


3) 自定义窗口标识符
自定义窗口标识符必须是正值,并且要避免在窗口标识符常量所在的范围之内自定义窗口标识符。
2. 框架对象的相关方法
1) Show()方法
该方法从Window类中继承而来,用于显示窗口,其语法格式如下: 




Show()


2) Close()方法
该方法从Window类中继承而来,用于关闭窗口,其语法格式如下: 




Close()


3) Destroy()方法
该方法从Window类中继承而来,用于销毁窗口,其语法格式如下: 




Destroy()


4) SetTitle()方法
该方法从TopLevelWindow类中继承而来,用于设置窗口标题,其语法格式如下: 




SetTitle(title)


其中,参数title表示窗口的标题。
5) SetIcon()方法
该方法从TopLevelWindow类中继承而来,用于设置窗口图标,其语法格式如下: 




SetIcon(icon)


其中,参数icon表示窗口图标。
6) SetSizeHints()方法
该方法从TopLevelWindow类中继承而来,用于设置窗口的最小尺寸和最大尺寸,其语法格式如下: 




SetSizeHints(minSize, maxSize)


其中,参数minSize表示最小尺寸; 参数maxSize表示最大尺寸。
7) SetMenuBar()方法
该方法用于将菜单栏添加到框架中,其语法格式如下: 




SetMenuBar(menuBar)


其中,参数menuBar表示菜单栏对象。
8) SetToolBar()方法
该方法用于将工具栏添加到框架中,其语法格式如下: 




SetToolBar(toolBar)


其中,参数toolBar表示工具栏对象。
9) SetStatusBar()方法
该方法用于将状态栏添加到框架中,其语法格式如下: 




SetStatusBar(statusBar)


其中,参数statusBar表示状态栏对象。
3. 创建框架
创建框架有两种方式,分别为使用Frame类和Frame类的子类。
1) 使用Frame类创建框架
示例代码如下: 




#资源包\Code\chapter3\3.4\0304.py

import wx

class App(wx.App):

def OnInit(self):

frame = wx.Frame(parent=None, title='框架(Frame类)', pos=(100, 100), 

size=(600, 500))

frame.Show()

return True

def OnExit(self):

print('应用程序已退出,谢谢使用!')

return False

if __name__ == '__main__':

app = App()

app.MainLoop()


上面代码的运行结果如图31所示。


图31框架(Frame类)


2) 使用Frame类的子类创建框架
示例代码如下: 




#资源包\Code\chapter3\3.4\0305.py

import wx




class MyFrame(wx.Frame):

def __init__(self):

super().__init__(parent=None, title='框架(Frame类)', pos=(100, 100), 

size=(600, 500))

class App(wx.App):

def OnInit(self):

frame = MyFrame()

frame.Show()

return True

def OnExit(self):

print('应用程序已退出,谢谢使用!')

return False

if __name__ == '__main__':

app = App()

app.MainLoop()


上面代码的运行结果如图32所示。


图32框架(Frame类)


3.4.2内容面板(Panel类)
在wxPython中,内容面板是一个容器元素,可以在其上添加控件。
1. 创建内容面板对象
可以通过wx模块中的Panel类创建内容面板对象,用于完成内容面板的创建,其语法如下: 




Panel(parent, id, pos, size, style, name)


其中,参数parent表示内容面板的父窗口; 参数id表示窗口标识符; 参数pos表示内容面板的位置; 参数size表示内容面板的尺寸; 参数style表示内容面板的类型; 参数name表示内容面板的名称。
2. 创建内容面板
示例代码如下: 




#资源包\Code\chapter3\3.4\0306.py

import wx

class MyFrame(wx.Frame):

def __init__(self):

super().__init__(parent=None, title='内容面板(Panel类)', pos=(100, 100), size=(600, 500))

#内容面板的父窗口为框架

panel = wx.Panel(parent=self)

class App(wx.App):

def OnInit(self):

frame = MyFrame()

frame.Show()

return True

def OnExit(self):

print('应用程序已退出,谢谢使用!')

return False

if __name__ == '__main__':

app = App()

app.MainLoop()


上面的代码的运行结果如图33所示。


图33内容面板(Panel类)


3.4.3菜单栏(MenuBar类)
菜单栏实际上是一种树形结构,为软件的大多数功能提供功能入口。在wxPython中,菜单栏中仅可以包含菜单,而在菜单中则可以包含菜单和菜单项,其布局如图34所示。


图34菜单栏的布局


1. 创建菜单栏对象
可以通过wx模块中的MenuBar类创建菜单栏对象,用于完成菜单栏的创建,其语法格式如下: 




MenuBar()


2. 菜单栏对象的相关方法
菜单栏对象的相关方法为Append()方法,主要用于将菜单添加至菜单栏中,其语法格式如下:  




Append(menu, item)


其中,参数menu表示要添加的菜单对象; 参数item表示要添加菜单的名称。
3. 创建菜单对象
可以通过wx模块中的Menu类创建菜单对象,用于完成菜单的创建,其语法格式如下: 




Menu()


4. 菜单对象的相关方法
1) Append()方法
该方法用于将菜单或菜单项添加至菜单中,其语法格式有以下两种:  




Append(id, item, menu)


其中,参数id表示窗口标识符; 参数item表示要添加菜单的名称; 参数menu表示要添加的菜单对象。




Append(menuitem)


其中,参数menuitem表示要添加的菜单项对象。
2) AppendCheckItem()方法
该方法用于添加可选中菜单项,其语法格式如下: 




AppendCheckItem(id, item)


其中,参数id表示窗口标识符; 参数item表示要添加菜单项的名称。
3) AppendSeparator()方法
该方法用于添加分隔符,其语法格式如下: 




AppendSeparator()


4) FindItemById()方法
该方法用于通过窗口标识符查找菜单项,其语法格式如下: 




FindItemById(id)


其中,参数id表示窗口标识符。
5. 创建菜单项对象
可以通过wx模块中的MenuItem类创建菜单项对象,用于完成菜单项的创建,其语法格式如下: 




MenuItem(parentMenu, id, text, helpString, kind)


其中,参数parentMenu表示菜单项对象的父菜单; 参数id表示窗口标识符; 参数text表示菜单项的名称; 参数helpString用于在状态栏中显示提示信息; kind表示菜单项类型,包括wx.ITEM_NORMAL(普通菜单项,默认)、wx.ITEM_SEPARATOR(分割线菜单项)、wx.ITEM_CHECK(复选框菜单项)和wx.ITEM_RADIO(单选按钮菜单项)。
6. 菜单项对象的相关方法
1) GetItemLabel()方法
该方法用于获取菜单项的标签内容,其语法格式如下: 




GetItemLabel()


2) GetItemLabelText()方法
该方法同样用于获取菜单项的标签内容,但与GetItemLabel()方法不同的是,该方法不会解析特殊字符,其语法格式如下: