2017-05-07 22 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

相關問題