wxPython:更改为框架中的其他面板会隐藏第一个面板,但在左上角显示一个小框而不是其他面板

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

我的应用程序框架包含一个默认的大面板和其中的两个子面板。单击特定菜单项时,我希望此默认面板更改为另一个面板。我的代码:

这是打开应用程序时显示的主框架。它包含一个面板,其中还包含另外两个面板:

import wx

class MainFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title="My Sample App.", size=(1280, 720))

        self.InitMenuBar()
        self.home_panel = HomePanels(self)

    def InitMenuBar(self):
        # Create Menu Bar
        menubar = wx.MenuBar()

        # Create File Menu
        fileMenu = wx.Menu()
        about_item = fileMenu.Append(wx.ID_ABOUT, 'About', 'Show About')
        self.Bind(wx.EVT_MENU, self.on_about, about_item)
        quit = fileMenu.Append(wx.ID_EXIT, '&Quit', 'Close')
        self.Bind(wx.EVT_MENU, self.OnQuit, quit)

        menubar.Append(fileMenu, '&File')

        self.SetMenuBar(menubar)
        self.Center()

    def OnQuit(self, event):
        self.Close()

    def on_about(self, event):
        # Show the About panel and hide the Main panel
        self.about_panel = AboutPanel(self)
        self.home_panel.Hide()
        self.about_panel.Show()

        self.SetAutoLayout(True)
        self.Layout()

下面是主框架中包含两个子面板的面板:

class HomePanels(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)

        main_sizer = wx.BoxSizer(wx.HORIZONTAL)

        # Left panel-----------------------------------------------------
        left_panel = wx.Panel(self, style=wx.BORDER_SIMPLE, size=(250, 600))
        left_panel.SetBackgroundColour('blue')
        main_sizer.Add(left_panel, 0, wx.EXPAND | wx.ALL, 1)

        # Right panel-----------------------------------------------------
        right_panel = wx.Panel(self, style=wx.BORDER_SIMPLE)
        right_panel.SetBackgroundColour('#f8f8ff')
        main_sizer.Add(right_panel, 1, wx.RIGHT | wx.BOTTOM | wx.EXPAND, 2)

        self.Center()
        self.SetSizer(main_sizer)
        self.SetAutoLayout(True)
        self.Layout()

我的

AboutPanel.py
。这就是当单击
HomePanel
菜单中的
About
选项时我想要用
File
面板替换的内容:

class AboutPanel(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)

        about_main_sizer = wx.BoxSizer(wx.HORIZONTAL)

        abt_text = wx.StaticText(self, label="About Panel", pos=(10, 10))
        about_main_sizer.Add(abt_text, 1, wx.EXPAND, 2)
        
        self.SetSizer(about_main_sizer)

运行此代码会产生以下输出:

然后单击

About
菜单中的
File
选项会产生以下输出:

我无法找出问题所在!是什么导致

About
面板出现这样的情况?

python-3.x user-interface wxpython desktop-application
1个回答
0
投票

这段代码可以做到这一点。您遇到的问题是您没有正确构建代码。面板应属于框架并且应位于尺寸调整器中。您的代码只是将“关于”面板放置在原始框架上,因此在左上角显示为一个小方块 - 这是它不在尺寸调整器中的明确标志。

import wx


class MainFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title="My Sample App.", size=(1280, 720))

        self.InitMenuBar()
        self.home_panel = HomePanels(self)

        self.sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.home_panel)
        self.SetSizer(self.sizer)

        self.Show()

    def InitMenuBar(self):
        # Create Menu Bar
        menubar = wx.MenuBar()

        # Create File Menu
        fileMenu = wx.Menu()
        about_item = fileMenu.Append(wx.ID_ABOUT, 'About', 'Show About')
        self.Bind(wx.EVT_MENU, self.on_about, about_item)
        quit = fileMenu.Append(wx.ID_EXIT, '&Quit', 'Close')
        self.Bind(wx.EVT_MENU, self.OnQuit, quit)

        menubar.Append(fileMenu, '&File')

        self.SetMenuBar(menubar)
        self.Center()

    def OnQuit(self, event):
        wx.CallAfter(self.Destroy)

    def on_about(self, event):
        # Show the About panel and hide the Main panel
        self._clear_sizer(self.sizer)
        self.about_panel = AboutPanel(self)
        self.sizer.Add(self.about_panel)
        self.Layout()

    def _clear_sizer(self, sizer):
        """Remove all of the widgets from the panel."""
        # self.print_sizer_items(sizer, 'B')
        for child in sizer.GetChildren():
            if child.IsSizer():
                # print('a', child, child.IsSizer())
                if child.IsSizer():
                    self._clear_sizer(child.GetSizer())
            else:
                # print('b', child, child.IsSizer())
                child.GetWindow().Destroy()
        sizer.Clear()


class HomePanels(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)

        main_sizer = wx.BoxSizer(wx.HORIZONTAL)

        # Left panel-----------------------------------------------------
        left_panel = wx.Panel(self, style=wx.BORDER_SIMPLE, size=(250, 600))
        left_panel.SetBackgroundColour('blue')
        main_sizer.Add(left_panel, 0, wx.EXPAND | wx.ALL, 1)

        # Right panel-----------------------------------------------------
        right_panel = wx.Panel(self, style=wx.BORDER_SIMPLE)
        right_panel.SetBackgroundColour('#f8f8ff')
        main_sizer.Add(right_panel, 1, wx.RIGHT | wx.BOTTOM | wx.EXPAND, 2)

        self.Center()
        self.SetSizer(main_sizer)
        self.SetAutoLayout(True)
        self.Layout()

class AboutPanel(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)

        about_main_sizer = wx.BoxSizer(wx.HORIZONTAL)

        abt_text = wx.StaticText(self, label="About Panel", pos=(10, 10))
        about_main_sizer.Add(abt_text, 1, wx.EXPAND, 2)

        self.SetSizer(about_main_sizer)


if __name__ == '__main__':
    wx_app = wx.App()
    MainFrame()
    wx_app.MainLoop()

如果你真的想显示 About dialog 不是更好,甚至 wx.adv.AboutDialogInfo

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