Python大佬手把手教你用wxPython模块编写界面程序( 二 )


状态栏状态栏即底部显示当前状态的状态条 。
布局管理布局可以分为绝对布局和布局管理器sizer 。绝对布局有很多缺点,比如:
(1)组件的尺寸和位置不随窗口的改变而改变;
(2)不同平台上应用程序可能显示不同;
(3)字体的改变可能破坏布局;
(4)如果想改变布局,必须将之前的全部推翻 。
因此,推荐使用布局管理器sizer来管理布局 。
wxPython常用的sizer有:wx.BoxSizer、wx.StaticBoxSizer、wx.GridSizer、wx.FlexGridSizer、wx.GridBagSizer 。
wx.BoxSizerwx.BoxSizer是最常见的布局管理器 。它的常用设置有:
(1)排列方向:wx.VERTICAL垂直排列还是wx.HORIZONTAL水平排列;
(2)排列比例:一个布局中所包含的组件的尺寸由其比例所决定,比例为0表示在窗口尺寸变化时保持尺寸不变,其他比例系数表示组件在该布局管理器中的尺寸占比;且通常使用wx.EXPAND旗标来使得组件占据管理器分配给它的所有空间;
(3)边界:组件的边界大小可以自定义设置,同时具体哪个边界(上下左右或全部)都可以任意指定;
(4)对齐方式:可以设定左端对齐、右端对齐、顶部对齐、底部对齐、中心对齐等多种对齐方式;
(5)在某一级容器组件中,使用SetSizer()来为其指定布局管理器;
(6)在布局管理器中用Add()方法来添加组件 。
wx.StaticBoxSizer是在BoxSizer周围加上了一个静态文本框的显示 。
wx.GridSizerwx.GridSizer是网格布局管理器,可以设置几排几列以及横纵的间距,网格中的组件尺寸都是相同的 。
(如果有的网格不需要添加组件,可以添加没有内容的StaticText作为占位符)
wx.FlexGridSizerwx.FlexGridSizer与wx.GridSizer类似,但其更灵活,它不要求网格中所有的组件尺寸都相同,而是在同一行中的所有组件都高度相同,而同一列中的所有组件都宽度相同 。
它还可以设置能growable的行和列,即在当前sizer中如果有空间,就将特定的行和列调整相应的大小来占据这个空间(注意将该行或列中的组件设为expandable) 。
wx.GridBagSizerwx.GridBagSizer是wxPython中最灵活的sizer(不仅仅是wxPython,其他函数库也有类似的配置),它可以显式地指定sizer中组件所占据的区域,比如横跨几行几列等 。
它的构造函数很简单:
wx.GridBagSizer(integer vgap, integer hgap)只需设定间距,然后通过Add()方法添加组件:
Add(self, item, tuple pos, tuple span=wx.DefaultSpan, integer flag=0,integer , userData=https://www.isolves.com/it/cxkf/yy/Python/2020-09-28/None)pos参数指定组件在这个虚拟网格中的起始位置,(0, 0)就代表左上角,span就指定它横跨几行几列,比如(3, 2)代表占据3行2列 。
如果想组件可以随窗口伸缩,别忘了设置expandle属性,及:
AddGrowableRow(integer row)AddGrowableCol(integer col)Sizer常见问题大部分的问题出现在:
(1)设置比例proportional错误,只有需要随窗口变化的组件和sizer才需要设置为非0,其他都设置为0 。且sizer和里面的组件可分别设置,比如下面的:
self.panel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )vbox = wx.BoxSizer( wx.VERTICAL )hbox1 = wx.BoxSizer( wx.HORIZONTAL )self.st1 = wx.StaticText( self.panel, wx.ID_ANY, u"Class Name", wx.DefaultPosition, wx.DefaultSize, 0 )self.st1.Wrap( -1 )hbox1.Add( self.st1, 0, wx.RIGHT, 8 )self.tc = wx.TextCtrl( self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )hbox1.Add( self.tc, 1, 0, 5 )vbox.Add( hbox1, 0, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, 10 )在vbox中添加了hbox1,hbox1中又添加了静态文本框st1和输入框tc,hbox1的比例为0,代表在vbox这一垂直排列的管理器变化时,hbox1尺寸不变化,但tc的比例又为1,所以vbox在垂直变化时,tc按着hbox1不变化,但vbox水平变化时,tc就会随着变化 。这样就有非常高的适应性 。
(总结起来:看是否expandable要看组件所在的sizer!!)
(2)边界border尺寸设置不统一,导致对不齐
(3)Expandable属性和proportion两个中有一个忘了设置,导致组件不能随窗口伸缩 。
这个sizer的编写此处可以借助wxFormBuilder工具来进行设计,实现所想即所得 。(wxFormBuilder能够实现即时的改变,但此处遇到一个小问题,在wxGridBagSizer设置了某列进行可伸缩后,在wxFormBuilder中却不能正确伸缩,反而generate code后直接调用能正确伸缩,所以也不能完全相信,但可以99%相信,实在调不通后可以换种运行方式接着调)
事件事件事件是一个图形界面程序的核心部分,任何图形界面程序都是事件驱动的 。


推荐阅读