Panel切換

      在〈Panel切換〉中尚無留言

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *