wxPython没有正确绑定事件的回调

时间:2010-11-22 03:55:10

标签: python wxpython closures

这是一个大致极少的示范性例子:

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函数不应该在其闭包中包含适当的名称并保留原始名称吗?

2 个答案:

答案 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)