来自鼠标事件的 WxPython ToolBar 工具参考

WxPython ToolBar Tool reference from mouse event

我的应用程序动态创建工具栏工具,因此只有一个鼠标事件处理程序分配给用户可能用鼠标单击的任何工具。有没有办法获取用户单击的工具或工具对象的参考索引?

工具栏是这样创建的,

self.m_toolBar = wx.ToolBar( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TB_HORIZONTAL )
self.m_toolBar.Bind( wx.EVT_LEFT_DOWN, self.onToolBar )

新工具是这样添加的,

self.m_toolBar.AddTool(wx.NewId(), "foo", wx.Bitmap(path), "bar")

事件处理程序,onToolBar,我可以得到原始工具栏对象,self.m_toolBar,

event.GetEventObject()

但我找不到对用户选择的实际工具的任何参考。 event.GetId() 总是 returns wx.ToolBar 的 ID,而不是我寻找的 ToolBarBase 对象。

选项,

1) 我确实注意到我可以获得鼠标的 (x,y) 位置,并且我可以根据工具图标的大小等计算出按下了哪个工具(索引),但这只是感觉这不是正确的方法。 2) 我想我可以创建多个 wx.ToolBar 对象并在每个对象中只放置一个工具,因此 event.GetId() 将直接与所选择的工具相关。

3) 我尝试的另一种选择是,

    obj = self.m_toolBar.AddTool(wx.NewId(), status_tip, wx.Bitmap(path), tooltip)
    obj.Bind(wx.EVT_LEFT_DOWN, self.onToolBarObj)

但是'ToolBarToolBase'对象没有属性'Bind'

但一定有更好的方法吗?

所以核心问题是没有为添加的工具使用正确的绑定方法,而不是

obj = self.m_toolBar.AddTool(wx.NewId(), status_tip, wx.Bitmap(path), tooltip)
obj.Bind(wx.EVT_LEFT_DOWN, self.onToolBarObj)

应该是,

obj = self.m_toolBar.AddTool(wx.NewId(), status_tip, wx.Bitmap(path), tooltip)
self.Bind(wx.EVT_MENU, self.onToolBarObj, obj)

您可以这样访问 ToolBarBase 对象:

obj = self.m_toolBar.AddTool(wx.NewId(), status_tip, wx.Bitmap(path), tooltip)
self.Bind(wx.EVT_MENU, self.onToolBarObj, obj)

def onToolBarObj(self, event)
pid = event.GetId()
tool = event.GetEventObject().FindById(pid)

拥有 'tool' 之后,您几乎可以对工具栏工具做任何想做的事情。