2017-05-07 4 views
1

大量のCheckbuttonがあり、それぞれ固有のIntVarが必要です。 チェックボタンをクリックしたときにIntVarの値を出力するコードをexcecuteすると、最後のものを除くすべてが1ではなく0を出力します。 誰でもこのコードのどこに問題があるのか​​を教えてください。Tkinterの大規模なCheckButtonsに一意のIntVar-sを割り当てる方法

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') 

あなたはそれは右ときラムダは、VARの値を検索することが予想される場合は「バー」は少し意外になります定義された。 command_earlyこれは、command_lateではありません。ラムダが定義されている場合のvar右を参照してください、とデフォルトの引数としてその値を格納します

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

あるいは

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

を使用してコードで

、。

+0

ありがとうございました。 –

+0

あなたが言ったようにコマンド部分を変更しましたが、結果は同じです。それはまだ最後のものを除くすべてのボタンのために、0を印刷します。:s –

+0

@ E.Zagああ!私のために働く。 [ここに何が起こるか](https://gist.github.com/72541c4ec173c64ac7c4b498e42ebc16) – tiwo

関連する問題