为什么wx.Panel用这个简单的代码弄乱了Sizer?

问题描述 投票:1回答:1

我是Python的新手,本周我正尝试使用wxPython模块创建GUI。我想我了解如何使用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()

施胶机再次正常工作。有人可以解释吗?似乎是巫术。

预先感谢。

python wxpython
1个回答
0
投票

大致来说,您没有将sizer应用于Main_window,并且ToolBar是独立的面板。在下面,我为自己分配了一个大小调整器,并将main_panel和工具栏放入其中,它们都有各自的大小调整器。希望这能说明问题。 (提示:这不是魔术,实际上是罗宾·邓恩先生提供的):)

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

© www.soinside.com 2019 - 2024. All rights reserved.