如何在wxPython中处理嵌套子菜单选择?

3 投票
1 回答
1462 浏览
提问于 2025-04-16 03:48

假设在一个有三层深度的子菜单结构中,我在第一层选择了 'car',在第二层选择了 'type',在第三层也是最后一层选择了 'suv'。有没有办法让我在我的 def OnPopupItemSelected(self, event) 方法中获取到这三个选择呢?

我希望我说得够清楚,如果不够,请留言让我重新表述。

1 个回答

3

看起来在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")

我原以为,既然有了“被点击”的菜单项,就可以反向查找它的子菜单。可是事实并不是这样,因为被点击的菜单项只保存了它父菜单的引用,而不是它所属于的子菜单项。

所以,我能写出来的最好的方法就是一个麻烦的递归函数,它从上到下查找被点击的子菜单。

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']

撰写回答