Context menu on wxTreeCtrl

I am trying to create a context menu on TreeCtrl. Here is a simplified example program:

import wx

class ContextMenu(object):
    def __init__(self):
        super(ContextMenu, self).__init__()
        self._menu = None
        self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)

    def OnContextMenu(self, event):
        if self._menu is not None:
            self._menu.Destroy()
        self._menu = wx.Menu()
        self.CreateContextMenu(self._menu)
        self.PopupMenu(self._menu)

    def CreateContextMenu(self, menu):
        raise NotImplementedError

class MyList(wx.TreeCtrl, ContextMenu):
    def __init__(self, parent, *args, **kwargs):
        super(MyList, self).__init__(parent, style=wx.TR_DEFAULT_STYLE|wx.TR_HIDE_ROOT)
        ContextMenu.__init__(self)

        self.root = self.AddRoot('')
        self.SetItemHasChildren(self.root, True)

        self.node1 = self.AppendItem(self.root, 'Node 1')
        self.node2 = self.AppendItem(self.root, 'Node 2')
        self.SetItemHasChildren(self.node2, True)
        self.node3 = self.AppendItem(self.node2, 'Node 3')

    def CreateContextMenu(self, menu):
        self._menu.Append(wx.ID_ADD)
        self._menu.Append(wx.ID_DELETE)
        self._menu.Append(wx.ID_EDIT)

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(MainFrame, self).__init__(*args, **kwargs)

        self.panel = wx.Panel(self)
        self.tree = MyList(self.panel)
        self.text = wx.TextCtrl(self.panel)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.tree, 1, wx.EXPAND)
        sizer.Add(self.text, 2, wx.EXPAND)
        self.panel.SetSizer(sizer)

        self.panel.Fit()
        self.SetInitialSize()

class App(wx.App):
    def __init__(self):
        super(App, self).__init__()
        MainFrame(None, title='Test').Show()

App().MainLoop()

My problem: right now the context menu appears when I right-click on an element in the tree, and not when I right-click in an empty area around the elements. Basically, I want to right-click on the root node, which is hidden by right-clicking in the empty space of the tree. How should I do it?

Edit: I tried to add a handler for EVT_TREE_ITEM_RIGHT_CLICK, but that didn't work either (only when clicking on items in the tree), and also blocked the context menu.

+3
source share

All Articles