我的应用程序框架包含一个默认的大面板和其中的两个子面板。单击特定菜单项时,我希望此默认面板更改为另一个面板。我的代码:
这是打开应用程序时显示的主框架。它包含一个面板,其中还包含另外两个面板:
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
面板出现这样的情况?
这段代码可以做到这一点。您遇到的问题是您没有正确构建代码。面板应属于框架并且应位于尺寸调整器中。您的代码只是将“关于”面板放置在原始框架上,因此在左上角显示为一个小方块 - 这是它不在尺寸调整器中的明确标志。
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?