2

我有这段代码可以在循环中创建一系列绑定:

from Tkinter import *
keys = {0:'m', 1:'n', 2:'o'}
def SomeFunc(event=None,number=11):
    print keys[number], number
root = Tk()
field = Canvas(root, height = 200, width = 200, bg = "gray") 
for i in range(2):
    root.bind("<KeyPress-%c>" % keys[i],lambda ev:SomeFunc(ev,i))
field.pack()
root.mainloop()

我的问题是,当我按“m”或“n”时,函数SomeFunc会以可变的“i”作为参数调用。我希望在我按“m”时使用 0 作为参数(使用“bind”时的数值“i”)调用它,在按“n”时使用 1。这可以做到吗?

4

1 回答 1

5

您的问题是该变量i捕获lambda但是您可以通过创建一个小辅助函数来解决该问题,例如:

for i in range(2):
    def make_lambda(x):
        return lambda ev:SomeFunc(ev,x)
    root.bind("<KeyPress-%c>" % keys[i], make_lambda(i))

这将为您创建的每个绑定创建一个新范围,因此执行for循环并在循环期间更改 ofi不会影响您已经使用的 lambda 函数。

于 2013-01-10T15:03:55.980 回答