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式という記述をするなら関数を括弧付きで書けるようです。これも自分の知識の範疇を超えちゃってるんで後回し。

参考にしたページ


コメント

スポンサーリンク


このブログの人気の投稿

gnuplotでプロットなどの色をcolornameの指定で変更する

catコマンドの出力を行番号付きにするためのコマンドラインオプション(-n, -b)

Ubuntu Softwareが起動しないのでいろいろと調べてみる(Ubuntu 20.04.1 LTS)

gnuplot : グラフにグリッド線を描く方法(set grid)

gnuplot : プロット画像のサイズ指定について(set sizeとの違い)