WxPython:在面板中嵌套面板

WxPython: Nesting panels within panels

我一直在尝试学习 wxPython,但无法理解 sizer。作为练习,我正在尝试布置三个面板,使它们出现在彼此的内部。首先,我使用图像编辑程序来显示近似值 window 我正在努力实现:

这是我用来尝试此操作的代码:

import wx


class MyApp(wx.Frame):

    def __init__(self):
        super().__init__(None, title="Test")

        outer_sizer = wx.BoxSizer()
        outer_panel = wx.Panel(self)
        outer_panel.SetBackgroundColour(wx.Colour("#94f7e7"))

        inner_panel = wx.Panel(outer_panel)
        inner_panel.SetBackgroundColour(wx.Colour("#b8e8a9"))
        inner_sizer = wx.BoxSizer()

        inner_inner_panel = wx.Panel(inner_panel)
        inner_inner_panel.SetBackgroundColour(wx.Colour("#cbebf5"))
        inner_inner_sizer = wx.BoxSizer()
        inner_inner_sizer.Add(inner_inner_panel, 1, wx.ALL | wx.EXPAND, 20)

        inner_sizer.Add(inner_inner_panel, 1, wx.ALL | wx.EXPAND, 20)

        outer_sizer.Add(inner_sizer, 1, wx.EXPAND)

        outer_panel.SetSizer(outer_sizer)


if __name__ == '__main__':
    app = wx.App()
    ma = MyApp()
    ma.Show()
    app.MainLoop()

这就是它的实际结果:

我希望上面的代码能够工作的原因是因为我使用以下代码一些成功:

import wx


class MyApp(wx.Frame):

    def __init__(self):
        super().__init__(None, title="Test")

        outer_sizer = wx.BoxSizer()
        outer_panel = wx.Panel(self)
        outer_panel.SetBackgroundColour(wx.Colour("#94f7e7"))

        inner_panel = wx.Panel(outer_panel)
        inner_panel.SetBackgroundColour(wx.Colour("#b8e8a9"))
        inner_sizer = wx.BoxSizer()

        inner_sizer.Add(inner_panel, 1, wx.ALL | wx.EXPAND, 20)

        outer_sizer.Add(inner_sizer, 1, wx.EXPAND)

        outer_panel.SetSizer(outer_sizer)


if __name__ == '__main__':
    app = wx.App()
    ma = MyApp()
    ma.Show()
    app.MainLoop()

产生这个:

现在显然我没有得到任何东西。我希望上面的内容能让一些善良的人找出我不理解的地方。

None 这里的相关帖子似乎很有帮助,因为它们嵌套的面板不会超过一层。

好的,第一步将只放入一个面板并制作一个包含 3 个 sizer 的层次结构。这完全符合您的预期,只是您不能更改 sizer 的背景颜色:

def __init__(self):
    super().__init__(None, title="Test")

    sz1 = wx.BoxSizer()
    sz2 = wx.BoxSizer()
    sz3 = wx.BoxSizer()

    p1 = wx.Panel(self)
    p1.SetBackgroundColour(wx.RED)

    sz3.Add(p1, 1, wx.ALL | wx.EXPAND, 20)
    sz2.Add(sz3, 1, wx.ALL | wx.EXPAND, 20)
    sz1.Add(sz2, 1, wx.ALL | wx.EXPAND, 20)

    self.SetSizer(sz1)

现在,要真正使用面板,您必须将面板放入 sizer (sizer.Add),然后将 sizer 放入面板 (panel.SetSizer),然后放入 sizer,依此类推。 .. 请注意设置正确的父项。

def __init__(self):
    super().__init__(None, title="Test")

    sz1 = wx.BoxSizer()
    sz2 = wx.BoxSizer()
    sz3 = wx.BoxSizer()

    p1 = wx.Panel(self)
    p2 = wx.Panel(p1)
    p3 = wx.Panel(p2)

    p1.SetBackgroundColour(wx.RED)
    p2.SetBackgroundColour(wx.GREEN)
    p3.SetBackgroundColour(wx.BLUE)

    sz3.Add(p3, 1, wx.ALL | wx.EXPAND, 20)  # innermost
    p2.SetSizer(sz3)
    sz2.Add(p2, 1, wx.ALL | wx.EXPAND, 20)
    p1.SetSizer(sz2)
    sz1.Add(p1, 1, wx.ALL | wx.EXPAND, 0)

    self.SetSizer(sz1)