wxPython:一曲MFC的挽歌,理想主义的绝唱( 二 )


2.1桌面应用程序开发的一般流程
用wxPython写一个桌面应用程序 , 通常分为6个步骤:
第1步:导入模块
第2步:创建一个应用程序
第3步:创建主窗口
第4步:在主窗口上实现业务逻辑
第5步:显示窗主口
第6步:应用程序进入事件处理主循环
除第4步之外的其它步骤 , 基本都是一行代码就可以完成 , 第4步的复杂程度取决于功能需求的多寡和业务逻辑的复杂度 。 下面这段代码就是这个一般流程的体现 。
#第1步:导入模块importwx#第2步:创建一个应用程序app=wx.App()#第3步:创建主窗口frame=wx.Frame(None)#第4步:在主窗口上实现业务逻辑st=wx.StaticText(frame,-1,'HelloWorld')#第5步:显示窗主口frame.Show()#第6步:应用程序进入事件处理主循环app.MainLoop()2.2HelloWorld
实际应用wxPython开发桌面应用程序的的时候 , 上面这样的写法难以实现和管控复杂的业务逻辑 , 因而都是采用面向对象的应用方式 。 下面的代码演示了以OOP的方式使用wxPython , 并且为窗口增加了标题和图标 , 设置了窗口尺寸和背景色 , 同时也给静态文本控件StaticText设置了字体字号 。
importwxclassMainFrame(wx.Frame):"""从wx.Frame派生主窗口类"""def__init__(self,parent):"""构造函数"""wx.Frame.__init__(self,parent,-1,style=wx.DEFAULT_FRAME_STYLE)self.SetTitle('最简的的应用程序')self.SetIcon(wx.Icon('res/wx.ico'))#设置图标self.SetBackgroundColour((217,228,0))#设置窗口背景色self.SetSize((300,80))#设置窗口大小self.Center()#窗口在屏幕上居中st=wx.StaticText(self,-1,'HelloWorld',style=wx.ALIGN_CENTER)#生成静态文本控件 , 水平居中st.SetFont(wx.Font(20,wx.DEFAULT,wx.NORMAL,wx.NORMAL,False,'Arial'))#设置字体字号if__name__=='__main__':app=wx.App()#创建一个应用程序frame=MainFrame(None)#创建主窗口frame.Show()#显示窗主口app.MainLoop()#应用程序进入事件处理主循环代码中用到了一个.png格式的图像文件文件 , 想要运行这段代码的话 , 请先替换成本地文件 。 至于文件格式 , SetIcon方法没有限定 , 常见的包括.ico和.jpg在内的图像格式都支持 。 代码运行界面如下图所示 。
wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
2.3常用控件介绍
尽管wxPython的核心模块和扩展模块提供了数以百计的各式控件和组件 , 但真正常用且必不可少的控件只有为数不多的几个:
wx.Frame-窗口
wx.Panel-面板
wx.StaticText-静态文本
StaticBitmap-静态图片
wx.TextCtrl-单行或多行文本输入框
wx.Button-按钮
wx.RadioButton-单选按钮
wx.CheckBox-复选按钮
wx.Choice-下拉选择框
所有的wxPython控件都有一个不可或缺的parent参数和若干关键字参数 , 通常 , 关键字参数都有缺省默认值 。
parent-父级对象
id-控件的唯一标识符 , 缺省或-1表示自动生成
pos-控件左上角在其父级对象上的绝对位置
size-控件的宽和高
name-用户定义的控件名
style-控件风格
wxPython的控件在使用风格上保持着高度的一致性 , 一方面因为它们从一个共同的基类派生而来 , 更重要的一点 , wxPython不像PyQt那样充斥着随处可见的重载函数 。 比如 , PyQt的菜单栏QMenuBar增加菜单 , 就有addMenu(QMenu)、addMenu(str)和addMenu(QIcon,str)等三种不同的重载形式 。 方法重载固然带来了很多便利 , 但也会增加使用难度 , 让用户无所适从 。
下面的代码演示了上述常用控件的使用方法 。
importwxclassMainFrame(wx.Frame):"""从wx.Frame派生主窗口类"""def__init__(self,parent):"""构造函数"""#调用父类的构造函数 , 从默认风格中去除改变窗口大小wx.Frame.__init__(self,parent,style=wx.DEFAULT_FRAME_STYLE^wx.RESIZE_BORDER)self.SetTitle('wxPython控件演示')self.SetIcon(wx.Icon('res/wx.ico'))self.SetSize((860,450))self.Center()#创建一个面板 , 用于放置控件panel=wx.Panel(self,-1)#在x=20 , y=20的位置 , 创建静态文本控件st=wx.StaticText(panel,-1,'我是静态文本控件',pos=(20,20))#在x=300 , y=20的位置 , 创建静态图片bmp=wx.Bitmap('res/forever.png')sb=wx.StaticBitmap(panel,-1,bmp,pos=(280,10))#在x=20,y=50的位置 , 创建文本输入框 , 指定输入框的宽度为260像素 , 高度默认tc1=wx.TextCtrl(panel,-1,value='https://pcff.toutiao.jxnews.com.cn/p/20220506/我是文本输入框',pos=(20,50),size=(260,-1))#在x=20,y=90的位置 , 创建文本输入框 , 指定样式为密码tc2=wx.TextCtrl(panel,-1,value='https://pcff.toutiao.jxnews.com.cn/p/20220506/我是密码',pos=(20,90),style=wx.TE_PASSWORD)#在x=20,y=130的位置 , 创建单选按钮 , 成组的单选按钮 , 第一个需要指定样式wx.RB_GROUPrb1=wx.RadioButton(panel,-1,'单选按钮1',pos=(20,130),style=wx.RB_GROUP,name='rb1')#在x=100,y=130的位置 , 创建单选按钮 , 不再需要指定样式wx.RB_GROUPrb2=wx.RadioButton(panel,-1,'单选按钮2',pos=(100,130),name='rb2')#在x=180,y=130的位置 , 创建单选按钮 , 不再需要指定样式wx.RB_GROUPrb3=wx.RadioButton(panel,-1,'单选按钮3',pos=(180,130),name='rb3')#在x=20,y=160的位置 , 创建复选按钮cb1=wx.CheckBox(panel,-1,'复选按钮',pos=(20,160))#在x=100,y=160的位置 , 创建复选按钮 , 指定其样式为wx.ALIGN_RIGHTcb2=wx.CheckBox(panel,-1,'文字在左侧的复选按钮',pos=(100,160),style=wx.ALIGN_RIGHT)#在x=20 , y=190的位置 , 创建按钮ch=wx.Choice(panel,-1,choices=['wxPython','PyQt','Tkinter'],pos=(20,190),size=(100,-1))ch.SetSelection(0)#在x=120 , y=190的位置 , 创建按钮btn=wx.Button(panel,-1,'按钮',pos=(150,190))#在x=20 , y=230的位置 , 创建文本框 , 指定大小为260*150 , 并指定其样式为多行和只读tc3=wx.TextCtrl(panel,-1,value='https://pcff.toutiao.jxnews.com.cn/p/20220506/我是多行文本输入框',pos=(20,230),size=(260,150),style=wx.TE_MULTILINE|wx.CB_READONLY)if__name__=='__main__':app=wx.App()#创建一个应用程序frame=MainFrame(None)#创建主窗口frame.Show()#显示窗主口app.MainLoop()#应用程序进入事件处理主循环代码运行界面如下图所示 。