找出 wxPython 中的嵌套子菜单选择?

发布于 2024-09-17 13:26:32 字数 239 浏览 0 评论 0原文

假设在深度为 3 级的较大子菜单结构中,我在第一级选择了 'car',在第二级选择了 'type',然后选择了 'suv' 在第三个也是最后一个级别。有什么方法可以在我的 def OnPopupItemSelected(self, event) 方法中计算出所有这三个选择?

我希望我已经说得足够清楚了,如果没有,请添加评论,以便我重新措辞。

Let's say in a larger submenu structure with a depth of 3 levels, I have selected 'car' in the first level, 'type' in the second, and 'suv' in the third and last level. Is there any way I can figure all these three selections in my def OnPopupItemSelected(self, event) method?

I hope I have made myself clear enough, if not, please add a comment so I can re-phrase.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤云独去闲 2024-09-24 13:27:12

看起来在 wxPython 演示中,他们以子父方式“编码” ids:

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

It looks like in the wxPython demo that they "code" the ids in a child parent fashion:

# 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")

I thought surely given the "clicked" menuitem you could walk the submenus backwards. This doesn't seem to be the case, as the clicked menuitem only holds a reference to it's parent menu and not the menuitem it is a submenu of.

So, the best I could code up was a nasty recursive function that walks top/down to find the submenu clicked.

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']
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文