弄清楚wxPython中的嵌套子菜单选择?

时间:2010-09-07 12:43:04

标签: python nested submenu

假设在一个深度为3级的较大子菜单结构中,我在第一级选择'car',第二级选择'type',第三级选择'suv'水平。有什么办法可以在def OnPopupItemSelected(self, event)方法中找出所有这三个选项吗?

我希望自己足够清楚,如果没有,请添加评论,以便重新发表评论。

1 个答案:

答案 0 :(得分:2)

在wxPython演示中,它们以子父方式“编码”id:

# top level menu
menu1 = wx.Menu()
menu1.Append(11,"11")
menu1.Append(12, "12")        

# sub menu 1
menu2 = wx.Menu()
menu2.Append(131, "131")
menu2.Append(132, "132")
menu1.AppendMenu(13,"13",menu2)

# sub menu 2
menu3 = wx.Menu()
menu3.Append(1321,"1321")
menu3.Append(1322,"1322")
menu3.Append(1323,"1323")
menu2.AppendMenu(132, "132", menu3)

# add top to menubar
menubar.Append(menu1, "&Top")

我认为肯定给了“点击”菜单,你可以向后走子菜单。这似乎不是这种情况,因为点击的menuitem只保存对它的父菜单的引用而不是menuitem它是一个子菜单。

所以,我编写的最好的代码是一个令人讨厌的递归函数,它可以上下移动来查找单击的子菜单。

def MenuClick(self, event):        
    def _menuItemSearch(menu,subMenuTree ,id):
        if not menu.FindItemById(id): return False
        # it is in this menu
        for menuItem in menu.MenuItems:               
            if menuItem.GetId() == id:
                subMenuTree.append(menuItem.GetLabel())
                return True
            if menuItem.GetSubMenu():
                if _menuItemSearch(menuItem.GetSubMenu(),subMenuTree,id):
                    subMenuTree.append(menuItem.GetLabel())
                    return True
                return False
    subMenuTree = []
    for menu,name in self.GetMenuBar().GetMenus():
        _menuItemSearch(menu,subMenuTree,event.Id)
    print subMenuTree

[u'1321', u'132', u'13']