在前一篇文章中使用了绝对布局,这里主要学习盒子布局。
wxPython提供了布局管理器类帮助实现界面布局,主要分为盒子布局管理器和网格布局管理器。
盒子布局管理器类是wx.BoxSizer,Box布局管理器是最常用的布局管理器,它可以让子窗口沿垂直或者水平方向布局。
主要构造方法如下:
wx.BoxSizer(wx.HORIZONTAL) #水平方向布局
wx.BoxSizer(wx.VERTICAL) #垂直方向布局
使用wx.BoxSizer对象的Add()方法添加子窗口到父窗口,其语法说明如下:
Add(window,proportion=0,flag=0,border=0) #添加到父窗口
Add(sizer,proportion=0,flag=0,border=0) #添加到另外一个布局对象
其中:proportion参数用于设置当前子窗口在父窗口中所占的空间比例,flag参数是布局标志,用来控制对齐方式、边框和调整尺寸,border参数用于设置边框的宽度。
flag对齐标志如下表所示:
示例:
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None,title="盒子布局",size=(400,300))
panel=wx.Panel(parent=self)
self.statictext=wx.StaticText(parent=panel,label='请单击OK!')
b=wx. Button(parent=panel,label='OK')
self.Bind(wx.EVT_BUTTON,self.on_click,b)
vbox=wx.BoxSizer(wx.VERTICAL) #垂直方向布局
vbox.Add(self.statictext,proportion=1,
flag=wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE|wx.TOP,
border=30)
vbox.Add(b,proportion=1,flag=wx.EXPAND|wx.BOTTOM,border=10)
panel.SetSizer(vbox)
def on_click(self,event):
self.statictext.SetLabelText('Hello World!')
app = wx.App()
frm=MyFrame()
frm.Show()
app.MainLoop()
盒子布局管理器嵌套
一个包含两个按钮,和一个静态文本窗口的示例 :
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None,title="盒子布局嵌套",size=(300,120))
panel=wx.Panel(parent=self)
self.statictext=wx.StaticText(parent=panel,label='请单击按钮!')
b1=wx. Button(parent=panel,id=10,label='YES')
b2=wx. Button(parent=panel,id=11,label='NO')
hbox=wx.BoxSizer(wx.HORIZONTAL)
hbox.Add(b1,proportion=1,
flag=wx.EXPAND|wx.ALL,
border=10)
hbox.Add(b2,proportion=1,
flag=wx.EXPAND|wx.ALL,
border=10)
vbox=wx.BoxSizer(wx.VERTICAL)
vbox.Add(self.statictext,proportion=1,
flag=wx.CENTER|wx.FIXED_MINSIZE|wx.TOP,
border=10)
vbox.Add(hbox,proportion=1,flag=wx.CENTER)
panel.SetSizer(vbox)
self.Bind(wx.EVT_BUTTON,self.on_click,id=10,id2=20)
def on_click(self,event):
event_id=event.GetId()
print(event_id)
if event_id==10:
self.statictext.SetLabelText('欢迎您!')
else:
self.statictext.SetLabelText('退出成功!')
app = wx.App()
frm=MyFrame()
frm.Show()
app.MainLoop()
| | ![]() |
上述代码首先将两个按钮(b1、b2)放到了一个水平盒子布局管理器对象(hbox)中,然后静态文本和(hbox)放到一个垂直方向的盒子布局管理器对象(vbox)中。