wx.GridBagSizer + wx.StaticBoxSizer:如何自动计算跨度
wx.GridBagSizer + wx.StaticBoxSizer: How to automate span calculation
我有以下 window 通过使用名为 CreateStaticBoxSizer 的函数生成,但是 StaticBox3 在它的末尾包含空的 spaces,我不知道想要它。
我希望它不包含空 space。我注意到,如果我将 StaticBox3 的跨度设为 7,它会给出我想要的结果,但我想自动生成一个跨度的过程,而不是对其进行硬编码:
代码使用基于它创建的项目数的跨度,因此如果它在 boxSizer 中创建 8 个项目,它使用 8 的跨度。
我不明白为什么这是错误的,有人可以澄清一下吗? span应该对应什么?
另外,StaticBox::4 侵入了 StaticBox::1 的行,为什么它不像 StaticBox::3 那样扩展?
生成这个的代码如下:
import wx
import wx.lib.inspection
class MyRegion(wx.Frame):
I = 0
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="My Region")
gridSizer = wx.GridBagSizer()
gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,0), span=(4,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(4,0), span=(4,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,1), span=(4,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(8), pos=(0,2), span=(8,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(6), pos=(0,3), span=(6,1), flag=wx.EXPAND)
self.SetSizer(gridSizer)
def CreateStaticBoxSizer(self, x=4):
box = wx.StaticBox(parent=self, label="StaticBox::" + str(MyRegion.I))
MyRegion.I += 1
sz = wx.StaticBoxSizer(orient=wx.VERTICAL, box=box)
for i in range(x):
sz.Add(wx.StaticText(parent=sz.GetStaticBox(),
label="This window is a child of the staticbox"))
return sz
if __name__ == "__main__":
app = wx.App()
frame = MyRegion(None)
frame.Show()
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
您的 sizer #3 的行跨度为 8,因此它的高度与 sizer #0 和 #1 的总和相同,这就是导致间隙的原因,因为这两个 sizer 有 2 个标签这需要更多的垂直 space 比一个。
可能有一些方法可以让它工作 wxGridBagSizer
但我认为这个 sizer 应该(几乎)永远不会被使用。对于任何类型的正常布局,您都应该使用 wxFlexGridSizer
和 wxBoxSizer
。
我有以下 window 通过使用名为 CreateStaticBoxSizer 的函数生成,但是 StaticBox3 在它的末尾包含空的 spaces,我不知道想要它。
我希望它不包含空 space。我注意到,如果我将 StaticBox3 的跨度设为 7,它会给出我想要的结果,但我想自动生成一个跨度的过程,而不是对其进行硬编码:
代码使用基于它创建的项目数的跨度,因此如果它在 boxSizer 中创建 8 个项目,它使用 8 的跨度。
我不明白为什么这是错误的,有人可以澄清一下吗? span应该对应什么?
另外,StaticBox::4 侵入了 StaticBox::1 的行,为什么它不像 StaticBox::3 那样扩展?
生成这个的代码如下:
import wx
import wx.lib.inspection
class MyRegion(wx.Frame):
I = 0
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="My Region")
gridSizer = wx.GridBagSizer()
gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,0), span=(4,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(4,0), span=(4,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,1), span=(4,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(8), pos=(0,2), span=(8,1), flag=wx.EXPAND)
gridSizer.Add(self.CreateStaticBoxSizer(6), pos=(0,3), span=(6,1), flag=wx.EXPAND)
self.SetSizer(gridSizer)
def CreateStaticBoxSizer(self, x=4):
box = wx.StaticBox(parent=self, label="StaticBox::" + str(MyRegion.I))
MyRegion.I += 1
sz = wx.StaticBoxSizer(orient=wx.VERTICAL, box=box)
for i in range(x):
sz.Add(wx.StaticText(parent=sz.GetStaticBox(),
label="This window is a child of the staticbox"))
return sz
if __name__ == "__main__":
app = wx.App()
frame = MyRegion(None)
frame.Show()
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
您的 sizer #3 的行跨度为 8,因此它的高度与 sizer #0 和 #1 的总和相同,这就是导致间隙的原因,因为这两个 sizer 有 2 个标签这需要更多的垂直 space 比一个。
可能有一些方法可以让它工作 wxGridBagSizer
但我认为这个 sizer 应该(几乎)永远不会被使用。对于任何类型的正常布局,您都应该使用 wxFlexGridSizer
和 wxBoxSizer
。