tkinter在循环中使用变量绑定函数

时间:2013-01-10 13:30:12

标签: python loops tkinter

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

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。可以这样做吗?

1 个答案:

答案 0 :(得分:5)

你的问题是变量ilambda 捕获,但你可以通过创建一个小帮助函数来解决这个问题,例如:

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函数。