首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WxPython:面板内的嵌套面板

WxPython:面板内的嵌套面板
EN

Stack Overflow用户
提问于 2020-02-27 08:07:20
回答 1查看 238关注 0票数 1

我一直在努力学习wxPython,只是不能把我的头转到四脚架上。作为一个练习,我试着布置三个面板,这样它们就会出现在彼此的内部。首先,我使用了一个图像编辑程序来显示我试图实现的近似窗口:

下面是我尝试这样做的代码:

代码语言:javascript
复制
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()

这就是它的实际结果:

我之所以希望上述代码能够工作,是因为我在以下代码方面取得了一些成功:

代码语言:javascript
复制
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()

产生了这样的结果:

很明显我什么都没得到。我希望以上这些能让一些善良的灵魂识别出我不理解的东西。

这里的相关帖子似乎没有很大的帮助,因为他们从来没有嵌套过一个以上的面板。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-27 09:54:47

好的,第一步将是放置一个面板,并建立一个层次结构的3个sizer。这完全符合您的预期,只有您不能更改sizer的背景色:

代码语言:javascript
复制
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,等等.只是要小心的设置正确的父母。

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60428760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档