这是一个大致极少的示范性例子:
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()
问题是每个菜单项在点击时都会打印“baz”。 menuclick
函数不应该在其闭包中包含适当的名称并保留原始名称吗?
答案 0 :(得分:2)
for循环name
将成为“baz”后,当您将menuclick
绑定到菜单事件时,它的值将不会回溯。
您可以通过事件本身获取菜单项名称,如下所示:
def menuclick(e):
print(menu.FindItemById(e.Id).Label)
答案 1 :(得分:0)
我找到了这个解决方案,我不知道为什么这种方法在内部版本不适用的地方有效:
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)