这是我的GUI和代码,如下所示, 预期结果是:
one - print 0
两个 - 打印1
三 - 打印2
但是,无论选择哪个复选框,程序都会打印“2”。我该如何解决?
from Tkinter import *
root = Tk()
my_list = ['one', 'two', 'three']
cb_value = []
cb = []
def show_index(idx):
print idx
for idx, each in enumerate(my_list):
cb_value.append(IntVar())
cb.append(Checkbutton(root, text=each, variable=cb_value[idx], command=lambda: show_index(idx)))
cb[idx].pack()
root.mainloop()
谢谢!
答案 0 :(得分:3)
改为使用lambda idx=idx:show_index(idx)
。
“问题”是python函数只绑定闭包中变量的名称(例如,参见https://stackoverflow.com/a/11953356/748858)。它们实际上在调用函数时从适当的位置查找值。在循环结束之前,您的函数永远不会被调用,此时,idx
的值为2.您调用的每个lambda函数都在查找idx
,因此他们得到了我在上面展示的技巧使idx
变量是函数的局部变量(而不是通过闭包获取它)。由于我是通过使用关键字参数执行此操作,并且在创建函数时评估关键字参数,因此始终可以获得正确的值。