试图获取所选的Checkbutton的Tkinter值,但不能按预期工作

时间:2013-05-31 15:38:48

标签: python user-interface tkinter tk

这是我的GUI和代码,如下所示, 预期结果是:

one - print 0

两个 - 打印1

三 - 打印2

但是,无论选择哪个复选框,程序都会打印“2”。我该如何解决?

enter image description here

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()

谢谢!

1 个答案:

答案 0 :(得分:3)

改为使用lambda idx=idx:show_index(idx)

“问题”是python函数只绑定闭包中变量的名称(例如,参见https://stackoverflow.com/a/11953356/748858)。它们实际上在调用函数时从适当的位置查找值。在循环结束之前,您的函数永远不会被调用,此时,idx的值为2.您调用的每个lambda函数都在查找idx,因此他们得到了我在上面展示的技巧使idx变量是函数的局部变量(而不是通过闭包获取它)。由于我是通过使用关键字参数执行此操作,并且在创建函数时评估关键字参数,因此始终可以获得正确的值。