在wx.GridBagSizer中放置元素(面板)

6 投票
2 回答
2746 浏览
提问于 2025-04-16 10:01

我正在使用一个叫做gridbagsizer的工具,把两个面板放在一个框架里。

control_panel = wx.Panel(self, id=ID_CONTROL_PANEL)
main_panel = wx.Panel(self, id=ID_MAIN_PANEL)

frame_sizer = wx.GridBagSizer(1, 1)
frame_sizer.Add(control_panel, (0, 0), (2, 5), flag=wx.EXPAND)
frame_sizer.Add(main_panel, (2, 0), (5, 5), flag=wx.EXPAND)
frame_sizer.AddGrowableRow(0)
frame_sizer.AddGrowableCol(0)
self.SetSizer(frame_sizer)

我希望控制面板在主面板的上面(就像你看到的那样)。但是我得到的结果却是这样:

alt text

我不明白为什么上面的面板比下面的面板大这么多,明明我设置的是相反的。上面是(2, 5),下面是(5, 5)。而且当我把它缩小的时候,它的表现很奇怪,基本上达到了我想要的效果(见下面的图片),但我不知道怎么在放大时保持这个比例。

alt text

不过当你开始放大(即使只是小幅度)时,你可以看到(如下图所示)形状和比例会剧烈变化,下面的面板变得更小,上面的面板变得更大。

alt text

我还在努力学习这些sizers,但在我看到的例子中找不到这个问题的解决办法。我也尝试过调整所有参数并进行一些测试,但还是搞不清楚这是怎么回事。任何帮助都会非常感激。

编辑:下面添加了图片以帮助理解评论。

alt text

2 个回答

1

在你指定的这个七行五列的网格中,只有第一行和第一列可以扩展。

控制面板占据了第一行,所以它会扩展来填满可用的空间。

wx.EXPAND这个标志只有在单元格位于可以扩展的行或列时才会起作用。

2

我个人建议使用一个垂直方向的BoxSizer。下面是一个简单的例子:

import wx

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")

        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)

        control_panel = wx.Panel(panel)
        control_panel.SetBackgroundColour("Yellow")
        main_panel = wx.Panel(panel)
        main_panel.SetBackgroundColour("Blue")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(control_panel, 3, wx.EXPAND)
        sizer.Add(main_panel, 1, wx.EXPAND)
        panel.SetSizer(sizer)

# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

我把每个面板的背景颜色都改了,这样更容易区分它们。注意,我给控制面板的比例设置为3,而主面板的比例设置为1。你可能还想看看“控件检查工具”,它可以帮助你更好地理解这些布局:

http://wiki.wxpython.org/Widget%20Inspection%20Tool

撰写回答