質問: python tkinterで、特定のボタン(例:root)が押されたら止めていた処理を再度実行する文はありますか? 例えば def button_stop_and_restert() 処理1 rootが押されるまで待つ 処理2 のような感じです。 もしありましたら教えてください。 イメージは https://scratch.mit.edu/projects/411273381/editor こんな感じです。 環境 python3.8.3rc1 win 10-10.0
回答: 「止めていた処理」はどのように処理を止めているのでしょう? 以前の回答にも書きましたが、一時停止・再開には スレッドで threading.Event が使えます。 Demo source code ``` import tkinter as tk from threading import Thread, Event def button_stop_and_start(event): print("処理1") event.wait() print("処理2") root = tk.Tk() event = Event() event.clear() thread = Thread(target=button_stop_and_start, args=(event,), daemon=True) thread.start() tk.Button(root, text="Start", command=event.set).pack() root.mainloop() ``` メインスレッドでは停止するとウィンドウが応答なしになってしまう為、 基本的には中断できません。ボタンが押せなくなってしまいます。 一応メインスレッドで実現する方法もありますが、 処理をジェネレータを使って表現して、タイマーを使って疑似的に実現することは可能です。 構文という意味ならジェネレータでの `yield` で処理の中断・再開は表現出来ますが、 ~~恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。~~ 追記2: 実際にコードを書いてみて、意外とこの方法も使えそうでした。 追記: ジェネレーターを使ったサンプル 注意事項: メインスレッド上での実行となる為、 この場合、時間の掛かる処理は出来ません。 ``` import tkinter as tk from functools import partial def button_stop_and_start(): print("処理1") yield print("処理2") yield print("処理3") root = tk.Tk() gen = button_stop_and_start() tk.Button(root, text="Start", command=partial(next, gen, None)).pack() root.after_idle(next, gen) # 実行開始 (処理1 ~ yield で止まる) root.mainloop() ```