我有这个代码在循环中创建一系列绑定:
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'作为参数调用。我希望用0作为参数调用它(当使用'bind'时我用'绑定'时的数值')当我按'm'时按下'n'时调用1。可以这样做吗?
答案 0 :(得分: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
循环并在循环期间更改i
不会影响您已经的lambda函数。