tkinter绑定函数与循环变量

use*_*118 2 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()
Run Code Online (Sandbox Code Playgroud)

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

slo*_*oth 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))
Run Code Online (Sandbox Code Playgroud)

这会为您创建的每个绑定创建一个新作用域,因此执行for循环和i在循环期间进行更改不会影响您已经使用过的lambda函数。