Python : TkinterのButton、commandで指定する関数に括弧を付けるとうまく動作しない
Tkinterのボタン配置、commandの記述でつまずく
PythonのTkinterを試しているのだけど、始めのボタンを配置するサンプルコードをいじっている時点でいきなりつまずく…。うまくいかないときのコード
サンプルコード自体はうまくいくのだけど、以下のようにボタンに関数を割り当てて実行しようとするとうまくいかない。import tkinter
def func():
print("test")
f = tkinter.Frame()
b = tkinter.Button(f, text="test", command=func())
b.pack()
f.pack()
f.mainloop()
このコード、一応実行は出来るしエラーも出ないのだけど、ボタンを押す前に"test"と出力されてしまうし、肝心のボタンを押しても何も出力されないという始末。
関数の括弧を外すと思ったように動作するようになる
で、いろいろ調べてみていると、commandで指定する関数(ここではfunc())は括弧を付けないで記述するとのこと。上述したコードでは
b = tkinter.Button(f, text="test", command=func())
となっていたのを、以下のようにfunc()関数の括弧を外して修正。
b = tkinter.Button(f, text="test", command=func)
これで実行すると、ちゃんと思った通りに機能するようになりました。
うまく実行出来た |
仕組み上の話
で、なんでボタンでこういう記述をするのか調べてみると、括弧付きの関数を記述するとスクリプトを実行した時にその場で関数が呼び出さるらしい。そうならないよう関数名だけ記述することでボタンを押したときにコールバックとしてその関数が呼び出されるとかなんとか…。まぁよく分からないけれど、そういうものなんでしょう。とりあえず作る分にはそういうものとして扱って、挙動の詳細はまた時間が出来たときにでも調べることにします。あと、lambda式という記述をするなら関数を括弧付きで書けるようです。これも自分の知識の範疇を超えちゃってるんで後回し。
参考にしたページ
- python - Why is Button parameter “command” executed when declared? - Stack Overflow
- Tkinter Callbacks
コメント
コメントを投稿