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


wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
3.2.栅格布局顾名思义 , 栅格布局就是将布局空间划分成网格 , 将控件放置到不同的网格内 。 栅格布局比较简单 , 用起来非常方便 。 栅格布局布局管理器也有很多种 , GridBagSizer是最常用的一种 。 下面是一个使用GridBagSizer实现栅格布局的例子 。
importwxclassMainFrame(wx.Frame):"""从wx.Frame派生主窗口类"""def__init__(self,parent):"""构造函数"""wx.Frame.__init__(self,parent,style=wx.DEFAULT_FRAME_STYLE)self.SetTitle('栅格布局')self.SetIcon(wx.Icon('res/wx.ico'))self.SetSize((800,440))#设置窗口大小self._init_ui()#初始化界面self.Center()#窗口在屏幕上居中def_init_ui(self):"""初始化界面"""panel=wx.Panel(self,-1)#创建容器面板sizer=wx.GridBagSizer(10,10)#每个控件之间横纵间隔10像素st=wx.StaticText(panel,-1,"用户名")sizer.Add(st,(0,0),flag=wx.TOP|wx.ALIGN_RIGHT,border=20)#在第0行0列 , 距离上边缘20像素 , 右对齐userName=wx.TextCtrl(panel,-1)sizer.Add(userName,(0,1),(1,3),flag=wx.EXPAND|wx.TOP,border=20)#在第0行1列 , 跨3列 , 距离上边缘20像素sb=wx.StaticBitmap(panel,-1,wx.Bitmap('res/python.jpg'))sizer.Add(sb,(0,5),(7,1),flag=wx.TOP|wx.RIGHT,border=20)#在第0行4列 , 跨7行 , 距离上右边缘20像素st=wx.StaticText(panel,-1,"密码")sizer.Add(st,(1,0),flag=wx.ALIGN_RIGHT)#在第1行0列 , 右对齐password=wx.TextCtrl(panel,-1,style=wx.TE_PASSWORD)sizer.Add(password,(1,1),(1,3),flag=wx.EXPAND)#在第1行1列 , 跨3列st=wx.StaticText(panel,-1,"学历")sizer.Add(st,(2,0),flag=wx.ALIGN_RIGHT)#在第2行0列 , 右对齐level1=wx.RadioButton(panel,-1,"专科")sizer.Add(level1,(2,1))#在第2行1列level2=wx.RadioButton(panel,-1,"本科")sizer.Add(level2,(2,2))#在第2行1列level3=wx.RadioButton(panel,-1,"研究生及以上")sizer.Add(level3,(2,3))#在第2行1列st=wx.StaticText(panel,-1,"职业")sizer.Add(st,(3,0),flag=wx.ALIGN_RIGHT)#在第3行0列 , 右对齐professional=wx.Choice(panel,-1,choices=["学生","程序员","软件工程师","系统架构师"])professional.SetSelection(0)sizer.Add(professional,(3,1),(1,3),flag=wx.EXPAND)#在第3行1列 , 跨3列#语言技能st=wx.StaticText(panel,-1,"语言技能")sizer.Add(st,(4,0),flag=wx.ALIGN_RIGHT|wx.LEFT,border=20)#在第4行0列 , 距离左边缘20像素 , 右对齐choices=["C","C++","Java","Python","Lua","JavaScript","TypeScript","Go","Rust"]language=wx.ListBox(panel,-1,choices=choices,style=wx.LB_EXTENDED)sizer.Add(language,(4,1),(1,3),flag=wx.EXPAND)#在第4行1列 , 跨3列isJoin=wx.CheckBox(panel,-1,"已加入QQ群",style=wx.ALIGN_RIGHT)sizer.Add(isJoin,(5,0),(1,4),flag=wx.ALIGN_CENTER)#在第5行0列 , 跨4列,居中btn=wx.Button(panel,-1,"提交")sizer.Add(btn,(6,0),(1,4),flag=wx.ALIGN_CENTER|wx.BOTTOM,border=20)#在第6行0列 , 跨4列,居中sizer.AddGrowableRow(4)#设置第4行可增长sizer.AddGrowableCol(3)#设置第3列可增长panel.SetSizer(sizer)panel.Layout()if__name__=='__main__':app=wx.App()frame=MainFrame(None)frame.Show()app.MainLoop()代码运行界面如下图所示 。
wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
事件驱动
一个桌面程序不单是控件的罗列 , 更重要的是对外部的刺激——包括用户的操作做出反应 。 如果把窗体和控件比作是桌面程序的躯体 , 那么响应外部刺激就是它的灵魂 。 wxPython的灵魂是事件驱动机制:当某事件发生时 , 程序就会自动执行预先设定的动作 。
4.1事件
所谓事件 , 就是我们的程序在运行中发生的事儿 。 事件可以是低级的用户动作 , 如鼠标移动或按键按下 , 也可以是高级的用户动作(定义在wxPython的窗口部件中的) , 如单击按钮或菜单选择 。 事件可以产生自系统 , 如关机, , 也可以由用户自定义事件 。
除了用户自定义事件 , 在wxPython中我习惯把事件分为4类: