如何在wxPython中处理嵌套子菜单选择?
假设在一个有三层深度的子菜单结构中,我在第一层选择了 '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']