【问题标题】:wxPython Popupmenu on a TreeCtrl right click右键单击 TreeCtrl 上的 wxPython Popupmenu
【发布时间】:2016-08-17 14:21:56
【问题描述】:

我想要一个树形控件,我可以在其中右键单击以创建弹出菜单。单击项目菜单时,将发送一个事件,其中包含树中的 ItemData。我不知道该怎么做。到目前为止,我只有一个简单的弹出菜单生成

# Panel

def __init__(self, ...):
    # ...
    self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnRightClick)

def OnRightClick(self, event):
    popupmenu = wx.Menu()
    entries = ['One', 'Two']
    for entry in entries:
        menuItem = popupmenu.Append(-1, entry)

如何从 TreeEvent 中获取 TreeCtrl ItemData?获得这些数据后,是否需要自定义事件才能将其附加到?

edit:获取项目数据需要绕道而行。

item = event.GetItem()
itemData = self.tree.GetItemData(item).GetData()

【问题讨论】:

    标签: wxpython


    【解决方案1】:

    好吧,我在 irc 上得到了一些帮助。获得项目数据后,我只使用 lambda 包装一个事件处理程序

    def OnRightClick(self, event):
        """Setup and Open a popup menu."""
        # Get TreeItemData
        item = event.GetItem()
        itemData = self.tree.GetItemData(item).GetData()
        # Create menu
        popupmenu = wx.Menu()
        entries = ['One', 'Two']
        for entry in entries:
            menuItem = popupmenu.Append(-1, entry)
            wrapper = lambda event: self.OnStuff(event, itemData)
            self.Bind(wx.EVT_MENU, wrapper, menuItem)
    
        # Show menu
        self.PopupMenu(popupmenu, event.GetPoint())
    
    def OnStuff(self, event, data=None):
        myEvent = events.myCustomEvent(self.GetId(), data=data)
        wx.PostEvent(self, myEvent)
    

    【讨论】:

    • 能否详细说明 myEvent 是如何定义的?
    • @jake77 我已经有一段时间没有处理这个问题了,但是 myEvent 可以是任何事件。如果你说得更具体一点,我可能会提供更多帮助,但不要抱太大希望
    • 我试过你的代码,但由于缺少events,它没有运行。所以我只是用印刷品代替了它。 @Shatnerz,无论如何感谢您的快速回答。
    • 它被用作任何任意事件的占位符
    • 弹出窗口显示在光标上方,有 2 个菜单条目,50px 垂直偏移看起来不错,至少在 gtk 上,代码:x,y=event.GetPoint();self.PopupMen(popupmenu,(x,y+50))
    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多