wxPython – BoxSizer
BoxSizer 允许控件以行或列的方式排列。 BoxSizer的 布局由其方向参数(wxVERTICAL或wxHORIZONTAL)决定。
Box = wx.BoxSizer(wxHORIZONTAL)
Box = wx.BoxSizer(wxVERTICAL)
Add()方法(继承自wxSizer)将其追加到sizer的下一行/列。
Box.Add(control, proportion, flag, border)
比例参数控制控件如何根据容器的尺寸来改变它的大小。各种标志参数的组合决定了控件在分类器中的外观。以下是一些标志 –
对齐标志
wx.ALIGN_TOP
wx.ALIGN_BOTTOM
wx.ALIGN_LEFT
wx.ALIGN_RIGHT
wx.ALIGN_CENTER_VERTICAL
wx.ALIGN_CENTER_HORIZONTAL
边框标志
wx.TOP
wx.BOTTOM
wx.LEFT
wx.RIGHT
wx.ALL
行为标志
S.N. | 行为标志和描述 |
---|---|
1 | wx.EXPAND 项目将扩展以填充提供给它的空间(wx.GROW也是如此)。 |
2 | wx.SHAPED 与EXPAND类似,但保持项目的长宽比。 |
3 | wx.FIXED_MINSIZE 不让项目变得比其初始最小尺寸小。 |
4 | wx.RESERVE_SPACE_EVEN_IF_HIDDEN 当一个项目被隐藏时,不允许设定者回收它的空间。 |
border参数是一个整数,是控件之间要留下的像素空间。比如说、
b = wx.StaticText(self, -1, “Enter a number”)
Box.Add(b,1,wx.ALL|wx.EXPAND,10)
以下是wx.BoxSizer类的一些其他方法。
S.N. | 方法和描述 |
---|---|
1 | SetOrientation() 设置方向 wxHORIZONTAL或wxVERTICAL |
2 | AddSpacer() 添加不可拉伸的空间 |
3 | AddStretchSpacer() 添加可拉伸的空间,这样调整窗口的大小将按比例影响控件的大小。 |
4 | Clear() 从尺寸器中删除儿童 |
5 | Detach() 将一个控件从尺寸器中删除,但不破坏它。 |
6 | Insert() 在指定位置插入一个子控件 |
7 | Remove() 将一个子控件从sizer中删除,并将其销毁。 |
例子
在下面的代码中,一个垂直的盒子尺寸被应用到一个放置在wxFrame窗口中的面板对象。
p = wx.Panel(self)
vbox = wx.wx.BoxSizer(wx.VERTICAL)
盒子里的第一行在中间显示一个标签(wx.StaticText对象),周围有20像素的边界。
l1 = wx.StaticText(p,label = "Enter a number",style = wx.ALIGN_CENTRE )
vbox.Add(l1,0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
在第二行,显示了一个wx.Button对象。由于有wx.EXPAND标志,它占据了整个窗口的宽度。
b1 = wx.Button(p, label = "Btn1")
vbox.Add(b1,0, wx.EXPAND)
下一行也包含一个按钮。它不是用EXPAND标志添加的。相反,由于ALIGN_CENTER_HORIZONTAL的存在,默认尺寸的按钮出现在水平方向的中央。
b2 = wx.Button(p, label = "Btn2")
vbox.Add(b2,0,wx.ALIGN_CENTER_HORIZONTAL)
在下一行,添加了一个TextCtrl对象,其比例参数设置为1,并设置了EXPAND标志。结果是,它的尺寸变高了。
t = wx.TextCtrl(p)
vbox.Add(t,1,wx.EXPAND,10)
最后一行容纳了一个水平尺寸的对象,它又有一个标签和按钮,由一个可伸展的空间隔开。
hbox = wx.BoxSizer(wx.HORIZONTAL)
l2 = wx.StaticText(p,label = "Label2", style = wx.ALIGN_CENTRE)
hbox.Add(l2,0,wx.EXPAND)
b3 = wx.Button(p,label = "Btn3")
hbox.AddStretchSpacer(1)
hbox.Add(b3,0,wx.ALIGN_LEFT,20)
vbox.Add(hbox,1,wx.ALL|wx.EXPAND)
最后,垂直箱体尺寸被应用于wx.Panel对象。
以下是完整的代码 –
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title, size = (200,300))
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
p = wx.Panel(self)
vbox = wx.wx.BoxSizer(wx.VERTICAL)
l1 = wx.StaticText(p,label = "Enter a number",style = wx.ALIGN_CENTRE )
vbox.Add(l1,0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
b1 = wx.Button(p, label = "Btn1")
vbox.Add(b1,0,wx.EXPAND)
b2 = wx.Button(p, label = "Btn2")
vbox.Add(b2,0,wx.ALIGN_CENTER_HORIZONTAL)
t = wx.TextCtrl(p)
vbox.Add(t,1,wx.EXPAND,10)
hbox = wx.BoxSizer(wx.HORIZONTAL)
l2 = wx.StaticText(p,label = "Label2", style = wx.ALIGN_CENTRE)
hbox.Add(l2,0,wx.EXPAND)
b3 = wx.Button(p,label = "Btn3")
hbox.AddStretchSpacer(1)
hbox.Add(b3,0,wx.ALIGN_LEFT,20)
vbox.Add(hbox,1,wx.ALL|wx.EXPAND)
p.SetSizer(vbox)
app = wx.App()
Example(None, title = 'BoxSizer demo')
app.MainLoop()
上述代码产生的输出结果如下 —