创建wx.BoxSizer:
hbox = wx.BoxSizer(integer orient)
orient:(垂直方向)wx.VERTICAL 或(水平方向) wx.HORIZONTAL
hbox.Add(wx.Window window, integer proportion=0, integer flag = 0, integer border = 0)
window:需要添加到wx.BoxSizer的控件;
proportion:定义了控件在既定方向上所占空间的比例,是相对的,相对于其他组件,比如:在水平sizer中有三个按钮,porportion=0,表示保持本身大小;porportion=1,表示在水平方向上占三分之一的空间;porportion=2,表示在水平方向上占三分之二的空间。
flag:
flag参数定义了两个主要的行为:
第一个参数是窗口的边框:这个参数决定了边框的宽度,在此决定窗口某一侧添加边框的事件。
另一个参数决定了sizer事件的行为,当sizer改变时,空间的分配。并且分配的多少依赖于特定种类的sizer被使用。
flag参数可以使用 '|'来产生组合的多个flags。常用的flag参数:
border:调整控件的边框的宽度,此参数一般和flag参数配合使用。
如:hbox.Add(button, porprotion=1, flag=wx.EXPAND | wx.ALL,border= 20)
flag=wx.EXPAND | wx.ALL,border=20---------这代表的是button这个组件将充分的利用空间,但是会从四周预留出来20px作为border。所以如果说使用了wx.EXPAND标志,而没有设定border,那么我们的组件将充分的利用分配的空间。
vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add((-1, 20))vbox.Add((-1, 20)) # 添加了20个像素的空白空间
上图中布局实现方法:
1、整体上控件布局分上下两个布局,也就是我们需要创建一个垂直方向上的BoxSizer(v_box=wx.BoxSizer(wx.VERTICAL));
2、在分析上部分的控件的布局,可以看出:静态文本、输入框、三个按钮在同一水平方向上,由此我们需要创建一个水平方向上的BoxSizer布局管理器(h_box=wx.BoxSizer(wx.HORIZONTAL));
3、然后把h_box布局器放到v_box布局管理器;
4、最后再把wx.TextCtrl控件放入v_box布局管理器。
小技巧:控件一定要按需要布局的顺序放入BoxSizer布局器中。
完整实例:
#!/usr/bin/env python # -*- encoding:utf-8 -*- import wx class MyApp(wx.App): def OnInit(self): frame = MyFrame(parent=None, id=-1, title='ExampleBoxSizer') frame.Show(True) return True class MyFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title, size=(778, 494), style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX) self.panel = wx.Panel(self, -1) h_box_sizer = wx.BoxSizer(wx.HORIZONTAL) self.file_path = wx.TextCtrl(self.panel, -1) self.open_button = wx.Button(self.panel, -1, label=u'打开') self.save_button = wx.Button(self.panel, -1, label= u'保存') h_box_sizer.Add(self.file_path, proportion=1, flag=wx.EXPAND | wx.ALL, border=5) h_box_sizer.Add(self.open_button, proportion=0, flag= wx.ALL, border=5) h_box_sizer.Add(self.save_button, proportion=0, flag= wx.ALL, border=5) self.edit_text = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE|wx.TE_RICH2|wx.HSCROLL) v_box_sizer = wx.BoxSizer(wx.VERTICAL) v_box_sizer.Add(h_box_sizer, proportion=0, flag=wx.EXPAND) v_box_sizer.Add(self.edit_text, proportion=1, flag=wx.EXPAND, border=5) self.panel.SetSizer(v_box_sizer) def main(): app = MyApp() app.MainLoop() if __name__ == '__main__': main()