Python 如何为Tkinter中的一大组复选按钮分配唯一的IntVar-s

Python 如何为Tkinter中的一大组复选按钮分配唯一的IntVar-s,python,tkinter,Python,Tkinter,我有一大组复选按钮,每个都需要一个唯一的IntVar。 当我执行代码以在单击checkbutton时打印IntVar的值时,除了最后一个之外,其他每个值都打印0,而不是1。 谁能帮我找出这个代码中的问题在哪里 import tkinter as tk class application(): def __init__(self): self.win = tk.Tk() self.createWidgets() def createWidget

我有一大组复选按钮,每个都需要一个唯一的IntVar。 当我执行代码以在单击checkbutton时打印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()

关于您的问题,一个更简单的例子(不使用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')
如果您希望lambda在定义var时正确查找var的值,“bar”会有点令人惊讶<代码>早命令执行此操作,晚命令不执行此操作

在代码中,使用

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

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

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

关于您的问题,一个更简单的示例(不使用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')
如果您希望lambda在定义var时正确查找var的值,“bar”会有点令人惊讶<代码>早命令执行此操作,晚命令不执行此操作

在代码中,使用

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

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

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

如您所说,我更改了命令部分,但结果相同。它仍然为每个按钮打印0,但最后一个按钮除外:s@E.Zag哦对我有用。令人惊叹的。。。非常感谢你!我使用了var.get()而不是v.get()。现在我了解了lambda函数的功能。再次感谢:)我像你说的那样更改了命令部分,但结果是一样的。它仍然为每个按钮打印0,但最后一个按钮除外:s@E.Zag哦对我有用。令人惊叹的。。。非常感谢你!我使用了var.get()而不是v.get()。现在我了解了lambda函数的功能。再次感谢:)