我有一大堆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()
答案 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,并将其值存储为默认参数。