0

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

一——打印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()

谢谢!

4

1 回答 1

3

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

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

于 2013-05-31T15:41:12.487 回答