Почему wx.Panel испортил Sizer в этом простом коде? - PullRequest
1 голос
/ 15 апреля 2020

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

Этот код должен создать дочернюю панель для целей панели инструментов и некоторый контент после нее:

import wx

class Main_window (wx.Frame):
    def __init__(self):
        super(Main_window, self).__init__(parent = None, title = 'Some App')
        main_panel = wx.Panel(self)
        main_panel_sizer = wx.BoxSizer(wx.VERTICAL)

        # Calling panels
        toolbar = ToolBar(self)
        main_panel_sizer.Add(toolbar, 1, wx.EXPAND)
        button1 = wx.Button(main_panel, label='Button 1')
        main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
        text = wx.StaticText(main_panel, label = 'Text 1')
        main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)

        # Final lines of constructor
        main_panel.SetSizer(main_panel_sizer)
        self.Show()

class ToolBar (wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)
        self.SetBackgroundColour('blue')
        toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
        button2 = wx.Button(self, label = 'Button 2')
        toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
        self.SetSizer(toolbar_sizer)

if __name__ == '__main__':
    app = wx.App()
    frame = Main_window()
    app.MainLoop()

Но вывод - это беспорядок. Дочерняя панель, текст и кнопки расположены сверху. Но если я прокомментирую вызов панели инструментов:

import wx

class Main_window (wx.Frame):
    def __init__(self):
        super(Main_window, self).__init__(parent = None, title = 'Some App')
        main_panel = wx.Panel(self)
        main_panel_sizer = wx.BoxSizer(wx.VERTICAL)

        # Calling panels
        # toolbar = ToolBar(self)
        # main_panel_sizer.Add(toolbar, 1, wx.EXPAND)
        button1 = wx.Button(main_panel, label='Button 1')
        main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
        text = wx.StaticText(main_panel, label = 'Text 1')
        main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)

        # Final lines of constructor
        main_panel.SetSizer(main_panel_sizer)
        self.Show()

class ToolBar (wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)
        self.SetBackgroundColour('blue')
        toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
        button2 = wx.Button(self, label = 'Button 2')
        toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
        self.SetSizer(toolbar_sizer)

if __name__ == '__main__':
    app = wx.App()
    frame = Main_window()
    app.MainLoop()

Sizer снова работает как надо. Кто-то может это объяснить? Кажется, колдовство.

Спасибо заранее.

1 Ответ

0 голосов
/ 16 апреля 2020

Грубо говоря, вы не применили sizer к Main_window, а ToolBar - это отдельная панель.
Ниже я назначаю sizer для self и помещаю в него main_panel и панель инструментов, которые имеют свои собственные sizer.
Надеюсь, что все проясняется. (Подсказка: это не волхвы c - ну, на самом деле это так, любезность мистера Робина Данна):)

import wx

class Main_window (wx.Frame):
    def __init__(self):
        super(Main_window, self).__init__(parent = None, title = 'Some App')
        main_panel = wx.Panel(self)
        main_panel_sizer = wx.BoxSizer(wx.VERTICAL)
        main_sizer = wx.BoxSizer(wx.VERTICAL)

        # Calling panels
        toolbar = ToolBar(self)

        button1 = wx.Button(main_panel, label='Button 1')
        main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
        text = wx.StaticText(main_panel, label = 'Text 1')
        main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)

        main_panel.SetSizer(main_panel_sizer)
        main_sizer.Add(toolbar, 1, wx.EXPAND)
        main_sizer.Add(main_panel)
        # Final lines of constructor
        self.SetSizer(main_sizer)
        self.Show()

class ToolBar (wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)
        self.SetBackgroundColour('blue')
        toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
        button2 = wx.Button(self, label = 'Button 2')
        toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
        self.SetSizer(toolbar_sizer)

if __name__ == '__main__':
    app = wx.App()
    frame = Main_window()
    app.MainLoop()

enter image description here

...