Python 如何在wxformbuilder中防止垂直尺寸标注器将其子对象向下扩展

Python 如何在wxformbuilder中防止垂直尺寸标注器将其子对象向下扩展,python,wxpython,wxformbuilder,boxsizer,Python,Wxpython,Wxformbuilder,Boxsizer,我正在尝试用WX form builder为Python设计一个仪表板。我很难弄清楚如何使两个水平尺寸器(它们是垂直尺寸器的子对象)不会彼此相距很远。下面是描述我所指内容的屏幕截图: 蓝色箭头表示我希望textbox控件和标签向上靠近第一个标签 我的第一个直觉是,它与wx.EXPAND等标志有关,但是,我无法以使施胶器彼此更接近的方式更改这些标志。这几乎就像每次我放置一个测码器,它都会自动尝试在整个窗口中填充所有内容……这使得在表单上的精确位置放置项目变得非常困难。有没有关于如何阻止大小调整器扩

我正在尝试用WX form builder为Python设计一个仪表板。我很难弄清楚如何使两个水平尺寸器(它们是垂直尺寸器的子对象)不会彼此相距很远。下面是描述我所指内容的屏幕截图:

蓝色箭头表示我希望textbox控件和标签向上靠近第一个标签

我的第一个直觉是,它与wx.EXPAND等标志有关,但是,我无法以使施胶器彼此更接近的方式更改这些标志。这几乎就像每次我放置一个测码器,它都会自动尝试在整个窗口中填充所有内容……这使得在表单上的精确位置放置项目变得非常困难。有没有关于如何阻止大小调整器扩展到整个框架窗口大小的建议

我的下一步行动是尝试使用gridsizer或flex grid sizer,但是,我只是通过直接代码使用它们,您可以在网格中选择要添加小部件或对象的确切位置。使用FormBuilder时,我发现它们更难使用,主要是因为我无法在网格大小器中的某些索引处插入对象。它按顺序插入它们:

1,1->1,2->1,3->1,i->2,1->2,2->2,3->2,i->j,i

这意味着如果我需要改变网格中的某些内容…这非常困难。除了按顺序插入对象外,我是否缺少一些可以更轻松地将对象插入网格的内容

下面是一个5x5网格尺寸测量器未完全填充的示例,其中我指定了水平和垂直间隙=0:

除了能够在1,4处用文本框替换按钮外,我注意到水平间隙显然不是零,即使我为垂直和水平间隙指定了0。这也使得表单的设计变得非常困难。为什么按钮之间有水平间隙

只需将施胶器的比例设为0即可。如果“比例”大于0,布局引擎将尝试根据该值分配空间,否则它将使空间尽可能小,这正是您想要的。大多数情况下,我更喜欢比例为0

我没有使用wx.GridSizer,但我经常使用wx.GridBagSizer。您不必按顺序将小部件添加到wx.GridBagSizer,也不必为每个单元格放置小部件,它可以按照您的预期工作。将wx.GridBagSizer添加到wxformbuilder中的面板中,并将小部件添加到其中。您可以从gbsizeritem下的对象属性更改小部件的行、列,并在更改后相应放置


不幸的是,如果更改小部件的位置或添加新的小部件,则必须更新行和列的值,这是不可避免的。

正如您所注意到的,当使用大小调整器时,内容会扩展到合适的大小,如果使用不当,比例标志可能会破坏布局。 使用以下简单的代码:

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()
比例标志是添加到施胶器中时的第二个参数。 您将注意到,按钮已设置为0、1和2,请更改它们,然后查看按钮之间的相互关系以及按钮的大小参数。 将self.log或self.log2上的比例标志更改为1,并观察该标志是否展开。 最后,将框架尺寸变宽,并查看反应。 Sizer一开始可能非常令人沮丧,但一旦你得到它,它们就是强大的工具