2015-10-10 3 views
1

Я пытаюсь найти способ конденсировать и автоматизировать строительство главного меню (под строкой заголовка, с файла, редактировать, помощью и т.д.) в WxPython.Автоматизация настройки главного меню wxPython?

Выполнение каждого элемента меню является прямым, но я замечаю, что повторяю много, между добавлением, сортировкой идентификаторов и т. Д. Далее следуют другие уникальные ямы, например, если я хочу добавить значок в определенное меню или если у меня есть подменю, и у них могут быть подменю и т. д. Без единого последовательного способа детализации всего, просто добавив информацию в список или словарь или комбо из двух, мой объект 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) 

Я попытался с помощью списка-к-словаря вещи, чтобы сделать это так, мне не нужно определенный номер индекса при обращении к идентификатору, просто напишите по ключевому слову и получите идентификатор. Я пишу его один раз, и он применяется к остальной части функции.

Обратите внимание, что мне нужно сделать всю новую переменную и повторить ее, как 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, который читается из манифеста. –

Смежные вопросы