Wx Python: вложенные панели внутри панелей - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь выучить wx Python и просто не могу разобраться с классификаторами. В качестве упражнения я пытаюсь расположить три панели так, чтобы они появлялись внутри друг друга. Во-первых, я использовал программу для редактирования изображений, чтобы показать окно аппроксимации, которого я пытаюсь достичь:

Это код, который я чтобы попытаться это сделать:

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()

, который произвел это:

Теперь, очевидно, я чего-то не понимаю. Я надеюсь, что вышеизложенное позволит какой-то доброй душе определить, чего я не понимаю.

Кажется, что ни один из связанных постов здесь не очень помогает, поскольку они никогда не вкладывают панели более чем в один слой.

1 Ответ

2 голосов
/ 27 февраля 2020

Хорошо, первым шагом будет установка только одной панели и создание иерархии из 3-х размеров. Это работает точно так, как вы ожидаете, только вы не можете изменить цвет фона 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)
...