Panel
wx.Frame()是最外層的殼, 可以容納MenuBar, StatusBar, 另外就是顯示內容的wx.Panel(). Panel裏可以再度將每個元件置入.
如果從某一menu 想要切到另一項menu, 運算的功能有所改變, 那怎麼變化畫面呢. 當然就是把原本的panel從frame刪除, 然後新增新的panel, 再放入frame中
wx.Frame加入Panel前, 請記得先加入Layout管理器
切換Panel注意事項
wxWidget是使用C/C++寫成的, 所以在frame中執行self.RemoveChild()之後, 其實是還存在記憶体的. 必需再度使用self.panel.Destroy()去觸發panel的解建構子 ~Panel(), 這樣才能去除乾淨.
如果有Layout管理器, 需重新使用Add()加入Panel, 然後再啟用Frame的Layout重新佈局.
若沒有Layout管理器, 則要使用 SendSizeEvent()送出大小改變事件, 整個畫面才會更新.
反正就是說, 如果沒有Layout 管理器, 很多麻煩就會產生的啦.
# -*- coding: utf-8 -*- ########################################################################### ## Python code generated with wxFormBuilder (version Jun 17 2015) ## http://www.wxformbuilder.org/ ## ## PLEASE DO "NOT" EDIT THIS FILE! ########################################################################### import wx import wx.xrc ITEM_NEW_FILE = 1000 ITEM_SAVE_FILE = 1001 ITEM_EXIT = 1002 ITEM_COPY = 1003 ITEM_PASTE = 1004 ITEM_LICENSE = 1005 ITEM_VERSION = 1006 ITEM_CHART = 1007 ########################################################################### ## Class MainFrame ########################################################################### class MainFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size(500, 448), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) self.m_statusBar1 = self.CreateStatusBar(1, wx.STB_SIZEGRIP, wx.ID_ANY) self.m_menubar1 = wx.MenuBar(0) self.m_檔案 = wx.Menu() self.i_開新檔案 = wx.MenuItem(self.m_檔案, ITEM_NEW_FILE, u"開新檔案", wx.EmptyString, wx.ITEM_NORMAL) self.m_檔案.Append(self.i_開新檔案) self.i_儲存檔案 = wx.MenuItem(self.m_檔案, ITEM_SAVE_FILE, u"儲存檔案", wx.EmptyString, wx.ITEM_NORMAL) self.m_檔案.Append(self.i_儲存檔案) self.m_檔案.AppendSeparator() self.i_圖表 = wx.MenuItem(self.m_檔案, ITEM_CHART, u"圖表(&C)", wx.EmptyString, wx.ITEM_NORMAL) self.m_檔案.Append(self.i_圖表) self.m_檔案.AppendSeparator() self.i_離開 = wx.MenuItem(self.m_檔案, ITEM_EXIT, u"離開(&X)", wx.EmptyString, wx.ITEM_NORMAL) self.m_檔案.Append(self.i_離開) self.m_menubar1.Append(self.m_檔案, u"檔案(&F)") self.m_edit = wx.Menu() self.i_複製 = wx.MenuItem(self.m_edit, ITEM_COPY, u"複製", wx.EmptyString, wx.ITEM_NORMAL) self.m_edit.Append(self.i_複製) self.i_貼上 = wx.MenuItem(self.m_edit, ITEM_PASTE, u"貼上", wx.EmptyString, wx.ITEM_NORMAL) self.m_edit.Append(self.i_貼上) self.m_menubar1.Append(self.m_edit, u"編輯(&E)") self.m_menu3 = wx.Menu() self.i_版權 = wx.MenuItem(self.m_menu3, ITEM_LICENSE, u"版權", wx.EmptyString, wx.ITEM_NORMAL) self.m_menu3.Append(self.i_版權) self.i_版本 = wx.MenuItem(self.m_menu3, ITEM_VERSION, u"版本", wx.EmptyString, wx.ITEM_NORMAL) self.m_menu3.Append(self.i_版本) self.m_menubar1.Append(self.m_menu3, u"說明(&H)") self.SetMenuBar(self.m_menubar1) self.box=wx.BoxSizer(wx.VERTICAL) self.panel=wx.Panel(self) self.panel.SetBackgroundColour("#00aaff") self.box.Add(self.panel, 1, wx.EXPAND|wx.ALL, 1) self.SetSizer(self.box) self.Centre(wx.BOTH) self.Bind(wx.EVT_MENU, self.MenuHandler) def __del__(self): pass def MenuHandler(self, event): id = event.GetId() if id == ITEM_NEW_FILE: self.RemoveChild(self.panel) self.panel.Destroy() self.panel = wx.Panel(self) self.panel.SetBackgroundColour("yellow") self.box.Add(self.panel, 1, wx.EXPAND|wx.ALL, 1) self.Layout() elif id == ITEM_SAVE_FILE: wx.MessageBox("開新專案") elif id == ITEM_LICENSE: wx.MessageBox("Author : Thomas Wu") elif id == ITEM_VERSION: wx.MessageBox("Ver. 1.0.1") elif id == ITEM_EXIT: self.ExitMainLoop() app=wx.App() frame=MainFrame(None) frame.Show() app.MainLoop()
todo