如何防止垂直尺寸调整器在wxformbuild中一直向下扩展其子对象

2024-05-15 12:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用wxformbuilder为Python设计一个仪表板。我很难弄清楚如何使两个水平大小规和一个垂直尺寸尺的子级尺寸不致彼此相差太远。下面是一个屏幕截图,描述了我所指的:

enter image description here

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

我的第一反应是和wx.展开然而,我无法改变这些旗帜的方式,使规模大小接近对方。这几乎就像每次我放置一个尺寸调整器,它都会自动尝试将所有内容都放在整个窗口中……这使得将项目放置在表单上的精确位置非常困难。如何停止从整个窗口尺寸扩大的建议?

我的下一步行动是尝试使用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:

enter image description hereenter image description here

除了可以将按钮替换为1,4处的文本框之外,我还注意到,尽管我为垂直和水平间距指定了0,但水平间距显然不是零。这也使得设计表单非常困难。为什么按钮之间有水平间隙?


Tags: 对象网格表单内容顺序尺寸水平仪表板
2条回答

只需使sizer0proportion(零)。如果比例大于0,则布局引擎会根据该值分配空间,否则会使空间尽可能最小,这正是您想要的。大多数时候我更喜欢比例为0。在

我没用过wx.GridSizer公司但我经常用wx.GridBagSizer。您不必将小部件添加到wx.GridBagSizer公司或者不必为每个单元格放置小部件,它可以按预期工作。添加wx.GridBagSizer公司添加到wxformbuilder中的面板,并向其中添加小部件。您可以从gbsizeritem下的对象属性中更改小部件的rowcolumn,并在更改后相应地放置。在

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

正如您所注意到的,当使用sizer时,“stuff”会扩展到适合您的大小,如果使用不当,比例标志会严重破坏您的布局。
使用以下简单代码:

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并观察它的扩展。
最后,使框架尺寸变宽,并查看反应。
sizer一开始可能非常令人沮丧,但一旦你“得到”它,它们就是强大的工具。在

相关问题 更多 >