2

我正在尝试在 WX 表单生成器中为 Python 设计一个仪表板。我在试图弄清楚如何使两个作为子级的水平尺寸器与垂直尺寸器保持远离彼此扩展时遇到了麻烦。以下是描述我所指内容的屏幕截图:

在此处输入图像描述

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

我的第一直觉是这与 wx.EXPAND 等标志有关,但是,我无法以使尺寸器彼此靠近的方式更改这些标志。几乎就像每次我放置一个大小调整器时,它都会自动尝试将所有内容都放在整个窗口中......这使得很难将项目放置在表单上的精确位置。关于如何阻止大小调整器扩展到整个框架窗口大小的任何建议?

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

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

这意味着如果我需要更改网格中的某些内容……这非常困难。有没有什么我遗漏的东西可以更容易地将对象插入到网格中,而不是按顺序插入?

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

在此处输入图像描述 在此处输入图像描述

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

4

2 回答 2

3

正如您所注意到的那样,“stuff”在使用 sizers 时会扩展以适应,如果使用不当,比例标志可能会对您的布局造成严重破坏。
玩这个简单的代码:

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 一开始可能会非常令人沮丧,但一旦你“得到”它,它们就是强大的工具。

于 2015-09-28T15:33:55.037 回答
1

只需proportion将 sizer 设为0(零)。如果比例大于 0,布局引擎会尝试根据这个值分配空间,否则它会尽可能小,这就是你想要的。大多数时候,我更喜欢比例为 0。

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

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

于 2015-09-28T01:23:54.727 回答