2017-05-15 13 views
1

ここではチェックボタンがチェックされているかどうかに応じてブール値を返すと仮定した簡単なGUIがあります。ブール変数をFalseに設定しました。したがって、空のチェックボタンです。私が理解できないことは、ボタンをチェックすると、そのウィジェットにバインドされた関数がTrueではなくFalseを返すことです。何故ですか?ここで tkinter Checkbuttonウィジェットが間違ったブール値を返す

from tkinter import * 
from tkinter import ttk 

def getBool(event): 
    print(boolvar.get()) 

root = Tk() 

boolvar = BooleanVar() 
boolvar.set(False) 

cb = Checkbutton(root, text = "Check Me", variable = boolvar) 
cb.bind("<Button-1>", getBool) 
cb.pack() 

root.mainloop() 

空のボタン機能出力をチェック

...

False 

それは今ボタンがチェックされていることをTrueを返すべきではありません...コードですか?

+0

それはラムダコールバックを実行し、boolvar.traceを使用 - チェックボタンが機会を得る前に、その状態を更新する。 Checkbuttonの 'command ='オプションを代わりに使用してみてください。 – jasonharper

答えて

1

ブール値は、バインドコールバックが行われた後に変更されます。あなたの例を与えるために、これをチェック:

from tkinter import * 

def getBool(event): 
    print(boolvar.get()) 


root = Tk() 

boolvar = BooleanVar() 
boolvar.set(False) 
boolvar.trace('w', lambda *_: print("The value was changed")) 

cb = Checkbutton(root, text = "Check Me", variable = boolvar) 
cb.bind("<Button-1>", getBool) 
cb.pack() 

root.mainloop() 

をあなたがチェックボタンを押すと、最初の出力がFalseである、それはgetBoolコールバックが完了した後に値が変更されたことを意味し、"The value was changed"です。あなたは何をすべき

がコールバックを設定するためのcommand引数を使用することで、見て:

from tkinter import * 

def getBool(): # get rid of the event argument 
    print(boolvar.get()) 


root = Tk() 

boolvar = BooleanVar() 
boolvar.set(False) 
boolvar.trace('w', lambda *_: print("The value was changed")) 

cb = Checkbutton(root, text = "Check Me", variable = boolvar, command = getBool) 
cb.pack() 

root.mainloop() 

出力は、最初の"The value was changed"Trueです。私の例については

、私はあなたの結合は、マウスがクリックされた瞬間に発射されている疑いがあるとき、ブール値の変更('w'

+0

よろしくお願いします。完全な説明のために – acubal

関連する問題