如何将唯一的IntVar-s分配给Tkinter中的大量CheckButton

时间:2017-05-07 12:08:33

标签: python tkinter

我有一大堆Checkbuttons,每个都需要一个独特的IntVar。 当我点击单击检查按钮时打印IntVar值的代码时,除最后一个之外的每个都打印0而不是1。 有人可以帮我找一下这段代码中的问题吗?

import tkinter as tk

class application():

    def __init__(self):
        self.win = tk.Tk()
        self.createWidgets()

    def createWidgets(self):
        a=[]
        b=[]
        c=[1 for i in range(7)]
        k=1
        for index, item in enumerate(c):
            var=tk.IntVar()
            a.append(var)
            check=tk.Checkbutton(self.win, text='Button %d' %(k), command=  lambda: self.a(var.get()), variable =var)
            b.append(check)
            b[index].grid(row=k)
            k=k+1

    def a(self, var):
        print(var)

if __name__ == "__main__":
    app = application()
    app.win.mainloop()

1 个答案:

答案 0 :(得分:0)

一个更小的例子 - 不使用Tkinter - 你的问题是:

>>> var = 'foo'
>>> command_late = lambda: var
>>> command_early = lambda v=var: v

>>> command_late(), command_early()
('foo', 'foo')

>>> var = 'bar'
>>> command_late(), command_early()
('bar', 'foo')
&#39>'''如果你期望lambda在定义时能够正确查找var的值,那将会有点令人惊讶。 command_early执行此操作,command_late没有。

在您的代码中,使用

command = lambda v=var: self.a(v.get())

甚至

command = lambda var=var: self.a(var.get())

将在定义lambda时引用var,并将其值存储为默认参数。