2010-11-22 12 views
0

ここで大まかに最小限の実証的な例です:wxPythonのイベントへのコールバックを結合しないことは、適切

import wx 

app = wx.App(False) 
frame = wx.Frame(None) 

menuBar = wx.MenuBar() 
menu = wx.Menu() 
menuBar.Append(menu, "&Menu") 
frame.SetMenuBar(menuBar) 

for name in ['foo','bar','baz']: 
    menuitem = menu.Append(-1,"&"+name,name) 
    def menuclick(e): 
     print(name) 
    frame.Bind(wx.EVT_MENU, menuclick, menuitem) 

frame.Show(True) 
app.MainLoop() 

問題があること、すべてのメニュー項目、クリックされたとき、版画「バズ」。 menuclick関数は、クロージャーで適切な名前をラップして元の名前を保持するべきではありませんか?

答えて

2

した後は、それは価値がないだろうだ、「バズ」になりますメニューイベントにmenuclickをバインドした時に戻る。

あなたは、このようなイベント自体を経由して、メニュー項目名を取得することができます

def menuclick(e): 
    print(menu.FindItemById(e.Id).Label) 
+1

Hm、明らかに私はPythonのクロージャを読む必要があります。イベントのラベルを入手してくれてありがとう! – perimosocordiae

0

私はインナー-DEFバージョンがない場合、なぜこの作品はよく分からないで、私は、この解決策を見つけた:ループnameため

from functools import partial 

def onclick(name,e): 
    print(name) 

for name in ['foo','bar','baz']: 
    menuitem = menu.Append(-1,"&"+name,name) 
    frame.Bind(wx.EVT_MENU, partial(onclick,name), menuitem) 
+1

部分remebersは、それが呼ばれた瞬間に名前の値(のコピーを作成します)ので、それが動作します。 –

関連する問題