创建布局
gb = wx.GridBagSizer(vgap=0, hgap=0)
参数分别定义了单元格之间的 行间距 和 列间距,默认为0。
添加控件或其他布局
gb.Add(window, pos, span=DefaultSpan, flag=0, border=0, userData=None)
- window – 代表要添加的控件或其他布局(Sizer)
- pos – tuple,定义了控件的位置。如:左上角的位置为 (0,0)
- span – tuple,指定跨几行或者几列,如: (3,2) 表示让一个控件跨3行和2列
- flag – 更具体的定义控件在 Sizer 中的行为
- border – int,单位px。与flag连用改变控件周围的空间
参数 flag 更具体的定义控件在 wx.BoxSizer 中的行为,可以控制控件之间的距离、控件的对齐方式,不同参数可以通过竖线符号 |
组合,可选参数为:
与 border 控制控件之间的距离:
wx.LEFT – 左
wx.RIGHT – 右
wx.BOTTOM – 底部
wx.TOP – 顶部
wx.ALL – 周围
wx.EXPAND – 控件将使用所有剩余的空间
定义控件的对齐方式:
wx.ALIGN_LEFT – 左对齐
wx.ALIGN_RIGHT – 右对齐
wx.ALIGN_TOP – 顶部对齐
wx.ALIGN_BOTTOM – 底部对齐
wx.ALIGN_CENTER_VERTICAL – 竖直居中对齐
wx.ALIGN_CENTER_HORIZONTAL – 水平居中对齐
wx.ALIGN_CENTER – 居中对齐
设置行列自动伸缩
当窗口长宽改变时,组件大小默认不会发生改变:
GridBagSizer布局的可以设置某行某列自动伸缩(需要配合flag=wx.EXPEND, 见原码):
sizer.AddGrowableCol(1) # 设置第2列自动伸缩
sizer.AddGrowableRow(3) # 设置第4行自动伸缩
原码
import wx
class run(wx.Frame):
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
pnl = wx.Panel(self) # 创建画板
box = wx.BoxSizer(wx.VERTICAL) # 创建垂直Sizer
sizer = wx.GridBagSizer(10,10) # 创建网格布局
# 创建路径控件
urlTap = wx.StaticText(pnl,label="Url")
self.tc_url = wx.TextCtrl(pnl,value="")
pathTap = wx.StaticText(pnl,label="保存路径")
self.tc_path = wx.TextCtrl(pnl,value="./Video")
getPathButton = wx.Button(pnl,label="浏览")
# 将控件加入布局,布局加入Sizer
sizer.Add(urlTap, pos=(0,0), flag=wx.ALL, border=5)
sizer.Add(self.tc_url, pos=(0,1), span=(1,3), flag=wx.ALL|wx.EXPAND, border=5)
sizer.Add(pathTap, pos=(1,0), flag=wx.ALL, border=5)
sizer.Add(self.tc_path, pos=(1,1), span=(1,2), flag=wx.ALL|wx.EXPAND, border=5)
sizer.Add(getPathButton, pos=(1,3), flag=wx.ALL, border=5)
# 添加按钮控件
but1 = wx.Button(pnl,label="开始",size=(100,30))
but2 = wx.Button(pnl,label="关闭",size=(100,30))
sizer.Add(but2,pos=(2,3), flag=wx.ALL, border=5)
sizer.Add(but1,pos=(2,2), flag=wx.ALL, border=5)
# 添加文本框
self.textBox = wx.TextCtrl(pnl,value="现在在做测试!\n",style=wx.TE_READONLY|wx.TE_MULTILINE)
sizer.Add(self.textBox,pos=(3,0), span=(1,4), flag=wx.ALL|wx.EXPAND, border=5)
box.Add(sizer,proportion=1,flag=wx.ALL|wx.EXPAND,border=30)
sizer.AddGrowableCol(1)
sizer.AddGrowableRow(3)
pnl.SetSizer(box)
if __name__ == "__main__":
app = wx.App()
# 使用自定义框架
frame = run(None, title="视频爬取")
frame.Center()
frame.Show()
# 启动事件循环
app.MainLoop()