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.
user606547
source
share