自动化wxPython主菜单设置?

时间:2015-10-10 20:58:29

标签: python user-interface menu wxpython

我正在尝试找到一种方法来压缩和自动构建主菜单(在标题栏下方,使用文件编辑帮助< wxPython中的/ em>等)。

写出每个菜单项都是直接的,但我注意到我在自然,重排ID等之间重复了很多。其次是其他独特的坑,如果我想在特定菜单中添加图标,或者如果我有子菜单,他们可能有子菜单等。没有一种一致的方式来列出所有内容,只需将信息添加到列表或字典,或两者的组合,我的wx.Frame对象将变得非常密集。

我看不到干净有序的做法,缺少三维数组。即使在那时,我也不知道如何统一组织3D阵列,所以每件物品都准备好了。

这是我到目前为止(原谅任何缩进错误;它对我有效):

T

我尝试使用list-to-dictionary的东西来实现它,所以在引用ID时我不需要特定的索引号,只需写入关键字并获取ID。我写了一次,并将其应用到函数的其余部分。

注意我必须创建一个全新的变量并重复自己,比如MM_File,MM_Edit,MM_Help,每次我都会输入类似的信息来追加和绑定。请记住,有些菜单可能需要分隔符,或菜单中有菜单,或者我可能想在这些菜单项旁边使用精灵,所以我试图想办法如何组织我的数组到那样做。

将这个组织成一个简洁的系统的适当方法是什么,所以它不会膨胀这个类?

1 个答案:

答案 0 :(得分: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,虽然我个人觉得有点限制。