2015-10-10 27 views
1

我試圖找到一種方式來凝聚和自動化主菜單的結構(標題欄的下方,與文件編輯幫助等)在wxPython中。自動化wxPython主菜單設置?

寫出每一個菜單項都是直接的,但我注意到我在重複自己,重複添加,排序ID等等之後,跟着其他獨特的坑,如果我想添加一個圖標到特定的菜單,或如果我有子菜單,並且它們可能有子菜單等。如果沒有一個一致的方法來逐項列出所有內容,只需將信息添加到列表或字典或兩者的組合中,我的wx.Frame對象就會變得非常密集。

我看不到一個乾淨的有組織的方式做到這一點,缺乏一個三維數組。即使如此,我也不知道如何統一組織這個3D陣列,所以每個項目都準備好了。

這裏是我到目前爲止(請原諒任何縮進錯誤;它正常工作對我):

class frameMain(wx.Frame): 
    """The main application frame.""" 
    def __init__(self, 
       parent=None, 
       id=-1, 
       title='TITLE', 
       pos=wx.DefaultPosition, 
       size=wx.Size(550, 400), 
       style=wx.DEFAULT_FRAME_STYLE): 
     """Initialize the Main frame structure.""" 
     wx.Frame.__init__(self, parent, id, title, pos, size, style) 
     self.Center() 
     self.CreateStatusBar() 

     self.buildMainMenu() 

    def buildMainMenu(self): 
     """Creates the main menu at the top of the screen.""" 
     MainMenu = wx.MenuBar() 

     # Establish menu item IDs. 
     menuID_File = ['exit'] 
     menuID_Help = ['about'] 
     menuID_ALL = [menuID_File, 
         menuID_Help] 

     # Make a dictionary of the menu item IDs. 
     self.menuID = {} 
     for eachmenu in menuID_ALL: 
      for eachitem in eachmenu: 
       self.menuID[eachitem] = wx.NewId() 

     # Create the menus. 
     MM_File = wx.Menu() 
     FILE = {} 
     MM_File.AppendSeparator() 
     FILE['exit'] = MM_File.Append(self.menuID['exit'], 
             'Exit', 
             'Exit application.') 
     self.Bind(wx.EVT_MENU, self.onExit, FILE['exit']) 
     MainMenu.Append(MM_File, 'File') 

     MM_Help = wx.Menu() 
     HELP = {} 
     MM_Help.AppendSeparator() 
     HELP['about'] = MM_Help.Append(self.menuID['about'], 
             'About', 
             'About the application.') 
     self.Bind(wx.EVT_MENU, self.onAbout, HELP['about']) 
     MainMenu.Append(MM_Help, 'Help') 

     # Install the Main Menu. 
     self.SetMenuBar(MainMenu) 

我嘗試使用列表對字典的東西做,所以我不需要一個特定的索引號在引用一個ID時,只需寫入一個關鍵字並獲得該ID。我寫了一次,它應用於函數的其餘部分。

請注意,我必須創建一個全新的變量並重復自己,比如MM_File,MM_Edit,MM_Help,並且每次我都輸入類似的信息來追加和綁定。請記住,某些菜單可能需要分隔符,或菜單中有菜單,或者我可能想要在這些菜單項旁邊使用精靈,所以我正在嘗試計算如何組織我的數組來執行此操作。

將此組織成一個簡潔的系統的適當方法是什麼,所以它不會膨脹這個類?

回答

0

您可以採取幾種方法。如果你喜歡,你可以把菜單生成代碼放入一個輔助函數中。像這樣的東西應該工作:

def menu_helper(self, menu, menu_id, name, help, handler, sep=True): 
    menu_obj = wx.Menu() 
    if sep: 
     menu_obj.AppendSeparator() 
    menu_item = menu_obj.Append(menu_id, name, help) 
    self.Bind(wx.EVT_MENU, handler, menu_item) 
    self.MainMenu.Append(menu_obj, menu) 

這裏有一個完整的例子:

import wx 

class frameMain(wx.Frame): 
    """The main application frame.""" 
    def __init__(self, 
       parent=None, 
       id=-1, 
       title='TITLE', 
       pos=wx.DefaultPosition, 
       size=wx.Size(550, 400), 
       style=wx.DEFAULT_FRAME_STYLE): 
     """Initialize the Main frame structure.""" 
     wx.Frame.__init__(self, parent, id, title, pos, size, style) 
     self.Center() 
     self.CreateStatusBar() 

     self.buildMainMenu() 

    def buildMainMenu(self): 
     """Creates the main menu at the top of the screen.""" 
     self.MainMenu = wx.MenuBar() 

     # Establish menu item IDs. 
     menuID_File = 'exit' 
     menuID_Help = 'about' 
     menuID_ALL = [menuID_File, 
         menuID_Help] 

     # Make a dictionary of the menu item IDs. 
     self.menuID = {item: wx.NewId() for item in menuID_ALL} 


     # Create the menus. 

     self.menu_helper('File', self.menuID['exit'], 'Exit', 
         'Exit application', self.onExit) 


     self.menu_helper('Help', self.menuID['about'], 'About', 
         'About the application.', self.onAbout) 

     # Install the Main Menu. 
     self.SetMenuBar(self.MainMenu) 

    def menu_helper(self, menu, menu_id, name, help, handler, sep=True): 
     """ 
     """ 
     menu_obj = wx.Menu() 
     if sep: 
      menu_obj.AppendSeparator() 
     menu_item = menu_obj.Append(menu_id, name, help) 
     self.Bind(wx.EVT_MENU, handler, menu_item) 
     self.MainMenu.Append(menu_obj, menu) 

    #---------------------------------------------------------------------- 
    def onExit(self, event): 
     pass 

    def onAbout(self, event): 
     pass 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = frameMain() 
    frame.Show() 
    app.MainLoop() 

或者你可以創建一個可以處理所有的菜單中創建一個類。您也可以創建一個配置文件,其中包含您讀取的所有信息以創建菜單。另一種選擇是使用XRC,但我個人覺得這有點限制。

+0

我修改了你爲輔助函數所做的代碼,把它放在從清單讀取的for循環中。 –