1、總結
1、大體創建過程
1、創建一個 菜單欄 : menuBar = wx.MenuBar()

相當於這個白色地方,沒有File這個菜單
2、創建 菜單 : fileMenu = wx.Menu()

這兩個不是直接“用的”,叫菜單。既用來分類其他 菜單項 的文件夾樣
3、創建 菜單項 : newItem = wx.MenuItem()
例如上圖的 New Copy Cut Paste Radio_One 等等等等。
這些可以直接“點”的(看作按鈕)的叫做 菜單項。
創建的時候需要分配 id (int 整數),到時候菜單事件處理的時候需要通過傳遞的 id (event.GetId())來判斷單擊的按鈕。
4、將 菜單項 添加到 菜單中 : fileMenu.AppendItem(newItem)
這樣當我們單機 File 的時候就會打開這個"文件夾"

並且展示內容,添加多少就展示多少,並且按添加的順序展示
5、將 菜單 添加到 菜單欄 中 : menuBar.Append(fileMenu, title = "File")
之前我們只是構建了一個上圖紅框+File菜單 的一個整體對象:fileMenu。
然后我們要把這個 菜單對象 添加到菜單欄中。
6、將該 菜單欄 設置為我們窗口框架的“菜單欄” : self.SetMenuBar(menuBar)
即將之前建立的 菜單欄對象 放到窗口上去。
7、綁定 菜單事件 : self.Bind(wx.EVT_MENT, self.menuHandler)
調用 Bind() 這個綁定事件的函數,因為其他組件 比如按鈕 編輯框 都有事件。
所以這里的 wx.EVT_MENT 是表示綁定的是 菜單事件。
menuHandler() 是自定義函數 用來菜單事件。

id = event.GetId() 用來判斷單擊的 菜單項。
函數參數名稱:event 不能變,只能是這個單詞。
8、窗口框架的處理 : 與菜單欄無關了
例如 調整大小、出現位置、是否可見

2、各項詳解(參考其他)
1、用到的 class :
菜單欄 : wx.MenuBar 類
wx.MenuBar()
wx.MenuBar(n, menus, titles, style)
有一個參數的構造函數,此外還有一個默認的。
參數“n”表示的菜單的數目。Menu是菜單和標題的數組和字符串數組。如果style參數設置為wx.MB_DOCKABLE,菜單欄可以停靠。

菜單 : wx.Menu 類
wx.Menu類對象是一個或多個菜單項,其中一個可被用戶選擇的下拉列表。

該開始 new 菜單對象的時候 只要 fileMenu = wx.Menu() 即可
之后添加菜單項目的時候,可直接使用 Append() 函數添加,或 wx.MenuItem 類的一個對象被追加。
wx.Menu.Append(id, text, kind) Item = Wx.MenuItem(parentmenu, id, text, kind) wx.Menu.Append(Item)
菜單項:wx.MenuItem 類
當我們 new 菜單項對象時 需要填幾個參數。
newItem = wx.MenuItem(parentMenu, id, text, kind)
其中 :
parentMenu 為其 菜單的對面,比如上文提到的 newMenu 菜單項的 parentMenu 為 fileMenu
id 為該菜單項的 id 到時候處理 菜單項時間的時候需要用到滴
text 為這個菜單項的名稱
kind 為該菜單項的類型
①注冊 快捷鍵的方法 :參數text = "名稱/t快捷鍵"
比如 text = "Quit/tCtrl+Q"
這樣就注冊了 Ctrl + Q 的快捷鍵
②其他類型菜單項的方法
菜單項有 3 種:

只需要 參數 kind = 相關類型常量即可
2、感想
期間看了找了挺多資料 : http://www.yiibai.com/wxpython/wxpython_menus.html#
這個里面的很詳細,且例子經典。
o.o 要是先看不懂,就敲抄一邊會好很多。
關於wxPyton 中菜單欄的運用的,以下代碼能夠很好的展示相關的操作方法。
3、樣例代碼
1 #coding:utf-8 2 #author:Twobox 3 4 import wx 5 6 class Mywin(wx.Frame): 7 def __init__(self, parent, title): 8 super(Mywin, self).__init__(parent, title = title) 9 self.InitUI() 10 11 def InitUI(self): 12 #創建一個菜單欄 13 menuBar = wx.MenuBar() 14 15 #創建一個菜單 1 16 fileMenu = wx.Menu() 17 18 #創建一個菜單項 1-1 19 newItem = wx.MenuItem(fileMenu, id = wx.ID_NEW, text = 'New', kind = wx.ITEM_NORMAL) 20 fileMenu.AppendItem(newItem) 21 22 #添加一行線 23 fileMenu.AppendSeparator() 24 25 #創建一個子菜單 1-2 26 editMenu = wx.Menu() 27 28 #創建三個子菜單的菜單項目 1-2-1 and 1-2-2 and 1-2-3 29 cutItem = wx.MenuItem(editMenu, id = 122, text = "Cut", kind = wx.ITEM_NORMAL) 30 copyItem = wx.MenuItem(editMenu, id = 121, text = "Copy", kind = wx.ITEM_NORMAL) 31 pasteItem = wx.MenuItem(editMenu, id = 123, text = "Paste", kind = wx.ITEM_NORMAL) 32 editMenu.AppendItem(copyItem) 33 editMenu.AppendItem(cutItem) 34 editMenu.AppendItem(pasteItem) 35 36 #把子菜單 1-2 添加到菜單 1 中 37 fileMenu.AppendMenu(wx.ID_ANY, "Edit", editMenu) 38 39 # 添加一行線 40 fileMenu.AppendSeparator() 41 42 #添加兩個單選框 1-3 and 1-4 43 radio1 = wx.MenuItem(fileMenu, id = 13, text = "Radio_One", kind = wx.ITEM_RADIO) 44 radio2 = wx.MenuItem(fileMenu, id = 14, text = "Radio_Two", kind = wx.ITEM_RADIO) 45 fileMenu.AppendItem(radio1) 46 fileMenu.AppendItem(radio2) 47 #PS.單選框 只在自己區域之間(兩行線之間) 相互作用 48 49 # 添加一行線 50 fileMenu.AppendSeparator() 51 52 #添加一個 可選中 的菜單項 1-5 53 fileMenu.AppendCheckItem(id = 15, item = "Check") 54 55 #添加一個 菜單項 1-6 並注冊快捷鍵 56 quit = wx.MenuItem(fileMenu, id = wx.ID_EXIT, text = "Quit\tCtrl+Q", kind = wx.ITEM_NORMAL) 57 fileMenu.AppendItem(quit) 58 59 #將 fileMenu 菜單添加到菜單欄中 60 menuBar.Append(fileMenu, title = 'File') 61 62 #設置窗口框架的菜單欄為 menuBar 63 self.SetMenuBar(menuBar) 64 65 #綁定事件處理 66 self.Bind(wx.EVT_MENU, self.menuHandler) 67 68 #讓其在屏幕中間打開調整大小展示 69 self.SetSize((300,400)) 70 self.Centre() 71 self.Show() 72 73 def menuHandler(self, event): 74 id = event.GetId() 75 if id == wx.ID_NEW: 76 print("NEW") 77 if id == wx.ID_EXIT: 78 exit(0) 79 80 81 82 if __name__ == "__main__": 83 ex = wx.App() 84 Mywin(None, 'Menu - Test') 85 #Mywin(None, 'Menu - Test') #可以同時打開兩個窗口 果然體現面向對象的程序開發思想 86 ex.MainLoop()
2017-08-20 14:21:26
