【问题标题】:Why wx.Panel messed up the Sizer in this simple code?为什么 wx.Panel 在这个简单的代码中搞砸了 Sizer?
【发布时间】:2020-04-15 13:12:17
【问题描述】:

我是 Python 新手,这周我正在尝试使用 wxPython 模块来创建 GUI。我想我理解了如何使用 sizers,但是这段代码发生的事情让我很感兴趣。有人可以帮我理解为什么吗?

此代码应为工具栏目的创建一个子面板,并在其后创建一些内容:

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 再次正常工作。有人可以解释一下吗?似乎是巫术。

提前致谢。

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    粗略地说,您没有将 sizer 应用到 Main_window 并且 ToolBar 是一个独立的面板。
    下面我为 self 分配一个 sizer 并将 main_panel 和 toolbar 放入其中,它们都有自己的 sizer。
    希望这能说明问题。 (提示:这不是魔法——实际上是魔法,由 Robin Dunn 先生提供):)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2021-08-12
      • 2021-09-22
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多