「これはヤバかったな」という遅刻エピソード

下記のサンプルのようにcheckにチェックを付け、command(show_selected)を呼び出した際に、時間のかかる処理を実行中であることを label などに表示したいのですが、'実行中'が表示されず、完了後に'実行終了'が表示されます。
'実行中'を表示するようにしたいのですが、ヒントをいただけないでしょうか。

------------------------
import tkinter

def show_selected():
label["text"] = '実行中'
print('チェックボタンを実行します') # 時間のかかる処理を想定しています。
label["text"] = '実行終了'

root = tkinter.Tk()

var = tkinter.IntVar(root)

check = tkinter.Checkbutton(
root,
variable=var,
command=show_selected,
)
check.pack()

label = tkinter.Label(root)
label.pack()

root.mainloop()
-----------------------

質問者からの補足コメント

  • うーん・・・

    show_selected が呼び出されたときに

    label["text"] = '実行中'
    は実行されても、labelの表示は変わらず、

    label["text"] = '実行終了'
    が実行された場合にlabelの表示が「実行終了」になるのはなぜなんでしょうか。

    ステップインで確認しても、label["text"] = '実行中' ではlabelの表示が変わりません。
    print('チェックボタンを実行します') の処理が重いかどうかは関係ない気がします。

      補足日時:2021/11/14 16:17

A 回答 (4件)

もっと簡単なのがあった(^^;



シングルスレッドに拘ると

適宜 root.update() を呼ぶ。
これで表示が即時更新されます。

で処理実行中イベントに応答してほしいときは

適宜 root.update_idletasks() も呼ぶ。

この辺は他の GUI フレームワークでも似たりよったりです。
    • good
    • 0
この回答へのお礼

希望の動作になりました。ありがとうございました。

お礼日時:2021/11/19 20:01

ひとつのやり方としては、ラベル更新してから


root.afterでタイマーイベントを登録して
イベントで残りの処理を実行する。

シングルスレッドでできるので比較的簡単。
    • good
    • 0

「labelの表示」は、どこで行われていますか。


print('チェックボタンを実行します') の処理は重くありません。
マルチスレッドでなくてよいならば、
①'実行中'を表示する。
②本体の処理を行う。
③'実行終了'を表示する。
とすればよいと思います。
①から③までの間は、フリーズみたいになります(実際は動いていても画面が動かない)。
    • good
    • 0

マルチスレッドにしないと、画面表示と、重たい計算は同時進行しないと思います。

    • good
    • 0
この回答へのお礼

マルチスレッド、勉強してみます。ありがとうございます。

お礼日時:2021/11/19 20:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報