2013-09-01 4 views
1

В всплывающем окне правой кнопки мыши есть около 5-6 пунктов меню, и привязка их к отдельным методам кажется неуклюжим, так как есть хороший кусок кодов, которые можно использовать повторно, возможно ли это сделать так?Привязать несколько wx.EVT_MENU к тому же методу?

self.Bind(wx.EVT_MENU, self.MenuClicked, id=self.menu1) 
self.Bind(wx.EVT_MENU, self.MenuClicked, id=self.menu2) 
self.Bind(wx.EVT_MENU, self.MenuClicked, id=self.menu3) 
self.Bind(wx.EVT_MENU, self.MenuClicked, id=self.menu4) 
self.Bind(wx.EVT_MENU, self.MenuClicked, id=self.menu5) 

def MenuClicked(self, event): 
    detect which menu being clicked 
    assign specific values to several variables regarding the menu being clicked 

    rest of the codes. 

Я заметил, что нет GetMenu() для wx.EVT_MENU, поэтому в основном, как вы узнаете, какое меню в настоящее время щелкнул?

ответ

2

Я предпочитаю связывая их отделить методы, но каждый туда собственный :) Вы можете использовать метод GetId() на события, а затем сравнить его с пунктами меню.

def MenuClicked(self, event): 
    id_selected = event.GetId() 
+0

Чувак, вы действительно пробовали эти коды сами? Объект 'CommandEvent 'не имеет атрибута' GetID'', поэтому' GetID() 'не будет работать ... – Shane

+0

Да Чувак. http://stackoverflow.com/questions/6791676/wxpython-get-event-id, http://zetcode.com/wxpython/events/ – Yoriz

+0

О, мой плохой. Я ошибочно опустил его в своем коде ... Спасибо большое! – Shane

0

Есть много способов сделать это, но стандартный и общий подход заключается в использовании functools.partial:

f = functools.partial(self.MenuClicked, my_id_1) 
self.Bind(wx.EVT_MENU, f, id=self.menu1) 

где my_id_1 является некоторый идентификатор, возможно self.menu1, если вам нравится, а затем в другом месте:

def MenuClicked(self, my_id, evt): 
    print my_id 
+0

Thanks mate! Мне было интересно, есть ли способ получить, какое меню кликает непосредственно из параметра 'event'? – Shane