如何防止垂直大小调整器在 wxformbuilder 中一直向下扩展其 children
How to prevent vertical sizers from expanding their children all the way downwards in wxformbuilder
我正在尝试在 WX 表单生成器中为 Python 设计仪表板。我在尝试弄清楚如何使 children 的两个水平 sizer 与垂直 sizer 保持相距很远时遇到麻烦。以下是描述我所指内容的屏幕截图:
蓝色箭头代表我想让文本框控件和标签向上靠近第一个标签。
我的第一直觉是这与 wx.EXPAND 等标志有关,但是,我无法以一种使 sizer 彼此更接近的方式更改这些标志。几乎就像每次我放置一个 sizer 它都会自动尝试将所有内容放入整个 window...这使得很难将项目放置在表单上的精确位置。 关于如何阻止 sizer 扩展到整个框架 window 大小的任何建议?
我的下一步行动是尝试使用 gridsizer 或 flex grid sizer 但是,我只通过直接代码使用它们,您可以在其中 select 您在网格中的确切位置想要添加一个小部件或 object。使用表单生成器,我发现它们更难使用,主要是因为我无法在网格大小调整器的某些索引处插入 objects。它按顺序插入它们:
1,1 -> 1,2 -> 1,3 -> 1,i -> 2,1 -> 2,2 -> 2,3 -> 2,i -> j,i
这意味着如果我需要更改网格中的某些内容...这非常困难。 我是否遗漏了一些东西可以更轻松地将 object 插入网格,而不是按顺序插入?
下面是 5x5 网格大小调整器(未完全填充)的示例之一,其中我指定了水平和垂直间隙 = 0:
除了能够用 1,4 处的文本框替换按钮外,我注意到水平间隙显然不为零,即使我将垂直和水平间隙指定为 0。这也使得设计表单变得非常困难。 为什么按钮之间有水平间隙?
只需使 sizer 的 proportion
0(零)。如果 proportion 大于 0,布局引擎会尝试根据此值分配 space 否则它会尽可能小,这就是你想要的。大多数时候我更喜欢比例为 0.
我没用过wx.GridSizer,但我经常用wx.GridBagSizer
。您不必按顺序将小部件添加到 wx.GridBagSizer,也不必为每个单元格添加小部件,它会按您预期的方式工作。在 wxformbuilder 中添加一个 wx.GridBagSizer 到你的面板,并将你的小部件添加到它。您可以从 gbsizeritem
下的对象属性更改小部件的 row
、 column
,更改后它会相应放置。
遗憾的是,如果更改小部件的位置或添加新小部件,则必须更新行值和列值,这是不可避免的。
正如您所注意到的,"stuff" 在使用 sizer 时会扩展以适应,如果使用不当,比例标志会严重破坏您的布局。
使用这段简单的代码:
import wx
class Summary(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Playing with Simple Sizers", size=(430,260))
self.panel = wx.Panel(self, wx.ID_ANY)
self.log = wx.TextCtrl(self.panel, wx.ID_ANY, value="input1:",size=(428,25))
self.log2 = wx.TextCtrl(self.panel, wx.ID_ANY, value="input2:", size=(428,25))
self.quit_button = wx.Button(self.panel, label="Quit",size=(60,25))
self.button1= wx.Button(self.panel, label="1",)
self.button2 = wx.Button(self.panel, label="2",size=(60,25))
self.button3 = wx.Button(self.panel, label="3",size=(60,25))
self.button4 = wx.Button(self.panel, label="4",size=(60,25))
self.quit_button.Bind(wx.EVT_BUTTON, self.OnQuit)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)
hbox4 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(self.quit_button, 0, wx.ALL|wx.EXPAND, 1)
hbox1.Add(self.log, 0, wx.ALL|wx.EXPAND, 1)
hbox2.Add(self.log2, 0, wx.ALL|wx.EXPAND, 1)
hbox3.Add(self.button1, 1, wx.ALL|wx.EXPAND, 1)
hbox3.Add(self.button2, 2, wx.ALL|wx.EXPAND, 1)
hbox4.Add(self.button3, 0, wx.ALL|wx.EXPAND, 1)
hbox4.Add(self.button4, 1, wx.ALL|wx.EXPAND, 1)
vbox.Add(hbox1, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
vbox.Add(hbox3, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
vbox.Add(hbox4, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
vbox.Add(hbox2, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
self.panel.SetSizer(vbox)
self.Show()
def OnQuit(self, event):
self.Close()
# Run the program
if __name__ == "__main__":
app = wx.App()
frame = Summary()
app.MainLoop()
比例标志是添加到sizer时的第二个参数。
您会注意到按钮的大小已设置为 0、1 和 2,更改它们并查看按钮之间的关系并使用按钮的大小参数进行播放。
将 self.log 或 self.log2 上的比例标志更改为 1 并观察其展开。
最后把frame size加宽看看反应
Sizer 起初可能会非常令人沮丧,但一旦你 "get" 它,它们就是强大的工具。
我正在尝试在 WX 表单生成器中为 Python 设计仪表板。我在尝试弄清楚如何使 children 的两个水平 sizer 与垂直 sizer 保持相距很远时遇到麻烦。以下是描述我所指内容的屏幕截图:
蓝色箭头代表我想让文本框控件和标签向上靠近第一个标签。
我的第一直觉是这与 wx.EXPAND 等标志有关,但是,我无法以一种使 sizer 彼此更接近的方式更改这些标志。几乎就像每次我放置一个 sizer 它都会自动尝试将所有内容放入整个 window...这使得很难将项目放置在表单上的精确位置。 关于如何阻止 sizer 扩展到整个框架 window 大小的任何建议?
我的下一步行动是尝试使用 gridsizer 或 flex grid sizer 但是,我只通过直接代码使用它们,您可以在其中 select 您在网格中的确切位置想要添加一个小部件或 object。使用表单生成器,我发现它们更难使用,主要是因为我无法在网格大小调整器的某些索引处插入 objects。它按顺序插入它们:
1,1 -> 1,2 -> 1,3 -> 1,i -> 2,1 -> 2,2 -> 2,3 -> 2,i -> j,i
这意味着如果我需要更改网格中的某些内容...这非常困难。 我是否遗漏了一些东西可以更轻松地将 object 插入网格,而不是按顺序插入?
下面是 5x5 网格大小调整器(未完全填充)的示例之一,其中我指定了水平和垂直间隙 = 0:
除了能够用 1,4 处的文本框替换按钮外,我注意到水平间隙显然不为零,即使我将垂直和水平间隙指定为 0。这也使得设计表单变得非常困难。 为什么按钮之间有水平间隙?
只需使 sizer 的 proportion
0(零)。如果 proportion 大于 0,布局引擎会尝试根据此值分配 space 否则它会尽可能小,这就是你想要的。大多数时候我更喜欢比例为 0.
我没用过wx.GridSizer,但我经常用wx.GridBagSizer
。您不必按顺序将小部件添加到 wx.GridBagSizer,也不必为每个单元格添加小部件,它会按您预期的方式工作。在 wxformbuilder 中添加一个 wx.GridBagSizer 到你的面板,并将你的小部件添加到它。您可以从 gbsizeritem
下的对象属性更改小部件的 row
、 column
,更改后它会相应放置。
遗憾的是,如果更改小部件的位置或添加新小部件,则必须更新行值和列值,这是不可避免的。
正如您所注意到的,"stuff" 在使用 sizer 时会扩展以适应,如果使用不当,比例标志会严重破坏您的布局。
使用这段简单的代码:
import wx
class Summary(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Playing with Simple Sizers", size=(430,260))
self.panel = wx.Panel(self, wx.ID_ANY)
self.log = wx.TextCtrl(self.panel, wx.ID_ANY, value="input1:",size=(428,25))
self.log2 = wx.TextCtrl(self.panel, wx.ID_ANY, value="input2:", size=(428,25))
self.quit_button = wx.Button(self.panel, label="Quit",size=(60,25))
self.button1= wx.Button(self.panel, label="1",)
self.button2 = wx.Button(self.panel, label="2",size=(60,25))
self.button3 = wx.Button(self.panel, label="3",size=(60,25))
self.button4 = wx.Button(self.panel, label="4",size=(60,25))
self.quit_button.Bind(wx.EVT_BUTTON, self.OnQuit)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)
hbox4 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(self.quit_button, 0, wx.ALL|wx.EXPAND, 1)
hbox1.Add(self.log, 0, wx.ALL|wx.EXPAND, 1)
hbox2.Add(self.log2, 0, wx.ALL|wx.EXPAND, 1)
hbox3.Add(self.button1, 1, wx.ALL|wx.EXPAND, 1)
hbox3.Add(self.button2, 2, wx.ALL|wx.EXPAND, 1)
hbox4.Add(self.button3, 0, wx.ALL|wx.EXPAND, 1)
hbox4.Add(self.button4, 1, wx.ALL|wx.EXPAND, 1)
vbox.Add(hbox1, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
vbox.Add(hbox3, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
vbox.Add(hbox4, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
vbox.Add(hbox2, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
self.panel.SetSizer(vbox)
self.Show()
def OnQuit(self, event):
self.Close()
# Run the program
if __name__ == "__main__":
app = wx.App()
frame = Summary()
app.MainLoop()
比例标志是添加到sizer时的第二个参数。
您会注意到按钮的大小已设置为 0、1 和 2,更改它们并查看按钮之间的关系并使用按钮的大小参数进行播放。
将 self.log 或 self.log2 上的比例标志更改为 1 并观察其展开。
最后把frame size加宽看看反应
Sizer 起初可能会非常令人沮丧,但一旦你 "get" 它,它们就是强大的工具。