菜单栏和工具栏,在大多数编程语言中,都会提供对应的布局,而工作区域的,需要用布局组件。当然,在wxPython中,大多数组件可用x、y轴坐标进行定位摆放,只是那样要费时费力,还会遇到调整窗口大小时,组件的尺寸和位置不会随之改变的问题,会遇到不同系统上,应用界面不一致的问题。
为此,wxPython提供了布局管理器Sizer,Sizer本身不是一个容器或一个窗口部件,它是一个屏幕布局的算法。真正实现布局的是wx.Sizer的子类,有按行或列布局的箱子布局wx.BoxSizer和wx.StaticBoxSizer;有按网格布局的wx.GridSizer、wx.FlexGridSizer和wx.GridBagSizer。
6.1 箱子布局
箱子布局wx.BoxSizer,是最常见的布局管理器,可支持横向布局和纵向布局。如果要同时支持横向和纵向布局,嵌套wx.BoxSizer就好。wx.StaticBoxSizer是在BoxSizer周围加上了一个静态文本框的显示。wx.BoxSizer的语法为:
box = wx.BoxSizer(orient=wx.HORIZONTAL)
box.Add(window=wx.Window, proportion=0, flag=0, border=0, userData=None)
orient值为wx.HORIZONTAL(默认)时,水平排列,为wx.VERTICAL时,垂直排列;
在布局管理器(如wx.BoxSizer)中,用Add()方法添加组件,它的参数说明如下:
window:继承于wx.Window的组件,如Button、StaticText等;
proportion:排列比例,一个布局中所包含的组件的尺寸由其比例所决定,比例为0表示在窗口尺寸变化时保持尺寸不变,其他比例系数表示组件在该布局管理器中的尺寸占比;可以用wx.EXPAND旗标来使得组件占据管理器分配给它的所有空间;
flag:对齐方式。可以设定wx.LEFT(左端对齐)、wx.RIGHT(右端对齐)、wx.TOP(顶部对齐)、wx.BOTTOM(底部对齐)、中心对齐(wx.ALIGN_CENTRE)等多种对齐方式,不同方向之间可以通过竖线符号|组合;wx.EXPAND|wx.ALL 会随着窗口变大而变化;
border:边界,调整组件的边框的宽度(上下左右),一般和flag参数配合使用。
程序清单:boxSizer.py
import wx
# 继承Frame
class BoxSizer(wx.Frame):
def __init__(self, *args, **kwargs):
super(BoxSizer, self).__init__(*args, **kwargs)
# 初始化窗口UI
self.init_ui()
def init_ui(self):
panel = wx.Panel(self, )
v_box = wx.BoxSizer(wx.VERTICAL)
# 姓名
h_box1 = wx.BoxSizer(wx.HORIZONTAL)
name_label = wx.StaticText(panel, label="姓名:",
style=wx.ALIGN_CENTRE_VERTICAL)
name_input = wx.TextCtrl(panel, size=(350, -1))
h_box1.Add(name_label, flag=wx.EXPAND | wx.ALL, border=5)
h_box1.Add(name_input, flag=wx.EXPAND | wx.ALL, border=1)
# 地址
h_box2 = wx.BoxSizer(wx.HORIZONTAL)
address_label = wx.StaticText(panel, label="地址:",
style=wx.ALIGN_CENTRE_VERTICAL)
address_input = wx.TextCtrl(panel, size=(350, -1))
h_box2.Add(address_label, flag=wx.EXPAND | wx.ALL, border=5)
h_box2.Add(address_input, flag=wx.EXPAND | wx.ALL, border=1)
# 静态布局
sb = wx.StaticBox(panel, label="个人爱好")
interest = wx.StaticBoxSizer(sb, wx.VERTICAL)
interest.Add(wx.CheckBox(panel, label="读书"),
flag=wx.LEFT | wx.RIGHT, border=10)
interest.Add(wx.CheckBox(panel, label="画画"),
flag=wx.LEFT | wx.RIGHT, border=10)
interest.Add(wx.CheckBox(panel, label="游泳"),
flag=wx.LEFT | wx.RIGHT, border=10)
# 按钮
btn_box = wx.BoxSizer(wx.HORIZONTAL)
submit_btn = wx.Button(panel, label="确定", size=(80, 80))
cancel_btn = wx.Button(panel, label="取消", size=(80, 80))
btn_box.Add(submit_btn, flag=wx.ALL | wx.ALIGN_CENTER, border=10)
btn_box.Add(cancel_btn, flag=wx.ALL | wx.ALIGN_CENTER, border=10)
# 添加布局
v_box.Add(h_box1, proportion=0, flag=wx.ALIGN_LEFT | wx.ALIGN_TOP, border=20)
v_box.Add(h_box2, proportion=0, flag=wx.ALIGN_LEFT | wx.ALIGN_TOP, border=20)
v_box.Add(interest, proportion=0, flag=wx.ALIGN_LEFT, border=20)
v_box.Add(btn_box, flag=wx.ALIGN_CENTER | wx.Center, border=20)
panel.SetSizer(v_box)
self.SetTitle("BoxSizer布局")
self.Centre()
self.Show(True)
def main():
app = wx.App(False)
BoxSizer(None)
app.MainLoop()
if __name__ == "__main__":
main()
运行程序之后,弹出的窗口如下:
布局比较直观,在垂直的wx.BoxSizer(wx.VERTICAL)布局里,添加两个水平的BoxSizer和一个垂直的StaticBoxSizer。布局里的flag指定组件的位置,border调整边距。flag=wx.ALIGN_CENTER | wx.Center表示居中对齐。至于组件的应用,将在下一节学习。
好了,箱子布局wx.BoxSizer的内容就说到这了,关注我,下一节更精彩。
码字不易,你的关注和转发是对我最大的鼓励,谢谢!
一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,关注我,你就赚到了。我正在分享Python、前端、Java和App方面的干货了。赶紧来围观啊!!!