2017-05-07 42 views
1

我有一大组CheckButtons,每个都需要一个独特的IntVar。 当我单击checkbutton时,超出了打印IntVar值的代码时,除最后一个之外,每个都打印0而不是1。 任何人都可以帮助我找出这个代码中的问题在哪里?如何分配独特IntVar -s到Tkinter的一大组CheckButtons

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

更小例子 - 不使用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的价值权当它是“酒吧”将是一个有点令人惊讶定义。 command_early这样做,command_late没有。

在你的代码,使用

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

甚至

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

将参考VAR正确定义的拉姆达时,并存储它作为默认的参数值。

+0

谢谢你的解释.. –

+0

我改变了你说的命令部分,但结果是一样的。它仍然打印0,除了最后的每个按钮..:s –

+0

@ E.Zag哦!适用于我。 [这是发生了什么](https://gist.github.com/72541c4ec173c64ac7c4b498e42ebc16) – tiwo

相关问题