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


wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
控件布局
3.1.分区布局
上面的例子里 , 输入框、按钮等控件的位置由其pos参数确定 , 即绝对定位 。 绝对定位这种布局方式非常直观 , 但不能自动适应窗口的大小变化 。 更普遍的方式是使用被称为布局管理器的wx.Sizer来实现分区布局 。 所谓分区布局 , 就是将一个矩形区域沿水平或垂直方向分割成多个矩形区域 , 并可嵌套分区布局管理器wx.Sizer的派生类有很多种 , 最常用到是wx.BoxSizer和wx.StaticBoxSizer 。
和一般的控件不同 , 布局管理器就像是一个魔法口袋:它是无形的 , 但可以装进不限数量的任意种类的控件——包括其他的布局管理器 。 当然 , 魔法口袋也不是万能的 , 它有一个限制条件:装到里面的东西 , 要么是水平排列的 , 要么是垂直排列的 , 不能排成方阵 。 好在程序员可以不受限制地使用魔法口袋 , 当我们需要排成方阵时 , 可以先每一行使用一个魔法口袋 , 然后再把所有的行装到一个魔法口袋中 。
创建一个魔法口袋 , 装进几样东西 , 然后在窗口中显示的伪代码是这样的:
魔法口袋=wx.BoxSizer()#默认是水平的 , 想要垂直放东西 , 需要加上wx.VERTICAL这个参数魔法口袋.add(确认按钮,0,wx.ALL,0)#装入确认按钮魔法口袋.add(取消按钮,0,wx.ALL,0)#装入取消按钮窗口.SetSizer(魔法口袋)#把魔法口袋放到窗口上窗口.Layout()#窗口重新布局魔法口袋的add()方法总共有4个参数:第1个参数很容易理解 , 就是要装进口袋的物品;第2个参数和所有add()方法的第2个参数之和的比 , 表示装进口袋的物品占用空间的比例 , 0表示物品多大就占多大地儿 , 不额外占用空间;第3个参数相对复杂些 , 除了约定装进口袋的物品在其占用的空间里面水平垂直方向的对齐方式外 , 还可以指定上下左右四个方向中的一个或多个方向的留白(padding);第4个参数就是留白像素数 。
下面是一个完整的例子 。
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((640,320))#设置窗口大小self._init_ui()#初始化界面self.Center()#窗口在屏幕上居中def_init_ui(self):"""初始化界面"""#创建容器面板panel=wx.Panel(self,-1)#生成黑色背景的预览面板view=wx.Panel(panel,-1,style=wx.SUNKEN_BORDER)view.SetBackgroundColour(wx.Colour(0,0,0))#生成按钮和多行文本控件btn_capture=wx.Button(panel,-1,'拍照',size=(100,-1))btn_up=wx.Button(panel,-1,'↑',size=(30,30))btn_down=wx.Button(panel,-1,'↓',size=(30,30))btn_left=wx.Button(panel,-1,'←',size=(30,30))btn_right=wx.Button(panel,-1,'→',size=(30,30))tc=wx.TextCtrl(panel,-1,'',style=wx.TE_MULTILINE)#左右按钮装入一个水平布局管理器sizer_arrow_mid=wx.BoxSizer()sizer_arrow_mid.Add(btn_left,0,wx.RIGHT,16)sizer_arrow_mid.Add(btn_right,0,wx.LEFT,16)#生成带标签的垂直布局管理器sizer_arrow=wx.StaticBoxSizer(wx.StaticBox(panel,-1,'方向键'),wx.VERTICAL)sizer_arrow.Add(btn_up,0,wx.ALIGN_CENTER|wx.ALL,0)#装入上按钮sizer_arrow.Add(sizer_arrow_mid,0,wx.TOP|wx.BOTTOM,1)#装入左右按钮sizer_arrow.Add(btn_down,0,wx.ALIGN_CENTER|wx.ALL,0)#装入下按钮#生成垂直布局管理器sizer_right=wx.BoxSizer(wx.VERTICAL)sizer_right.Add(btn_capture,0,wx.ALL,20)#装入拍照按钮sizer_right.Add(sizer_arrow,0,wx.ALIGN_CENTER|wx.ALL,0)#装入方向键sizer_right.Add(tc,1,wx.ALL,10)#装入多行文本控件#生成水平布局管理器sizer_max=wx.BoxSizer()sizer_max.Add(view,1,wx.EXPAND|wx.LEFT|wx.TOP|wx.BOTTOM,5)#装入左侧的预览面板sizer_max.Add(sizer_right,0,wx.EXPAND|wx.ALL,0)#装入右侧的操作区#为容器面板指定布局管理器 , 并调用布局方法完成界面布局panel.SetSizer(sizer_max)panel.Layout()if__name__=='__main__':app=wx.App()frame=MainFrame(None)frame.Show()app.MainLoop()代码运行界面如下图所示 。