Pythonのtkinterでアプリを作っていて、ボタンを押したときにwhileのあるプログラムが動くようになっています。
その時他のボタンが押せなくなり応答なしになってしまいます。
バックグラウンドで実行することはできないでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
- A. Threadを使う
但し、スレッド側からGUIにアクセスする場合は注意。
例えば、スレッド側で直接ダイアログを出したり等してはいけません。
- B. while の内容を小分けにして タイマー after() で処理する
- C. while ループの中で root.update()を呼ぶ
バックグラウンドで処理は A の方法です。
B タイマーで処理は、tkinter のイベントループ内で処理する方法です。
時間の掛かる処理があると応答なしになるリスクは残ります。
どちらが適切かかは処理内容・回数次第です。
C. は暫定的な対策。デバッグが困難になる為出来れば避けたほうが良い方法ですが、
定期的にupdate()を呼び出せれば、応答なしになるのは回避できます。
python
1#!/usr/bin/env python3.8 2 3import time 4import logging 5from threading import Thread 6from functools import partial 7import tkinter as tk 8 9logger = logging.getLogger(__file__) 10 11# A 12def countUp(logger, count=0, interval=1): # time.sleep interval sec 13 while 1: 14 count += 1 15 logger.info("Count: {:2}".format(count)) 16 time.sleep(interval) 17 18# B 19def countDown(count, interval=1*1000): # after interval ms 20 logger.info("Count: {:2}".format(count)) 21 root.after(interval, lambda: countDown(count-1, interval)) 22 23 24if __name__ == "__main__": 25 logging.basicConfig(level=logging.DEBUG, 26 format="[%(levelname)s][%(threadName)-10s] %(message)s") 27 28 thread = Thread(target=countUp, args=(logger,), name="SubThread", daemon=True) 29 30 def start(): 31 if not thread.ident: 32 thread.start() 33 countDown(10) 34 35 root = tk.Tk() 36 tk.Button(root, text="Start", command=start).pack() 37 tk.Button(root, text="Quit", command=root.quit).pack() 38 root.mainloop()
投稿2020/07/13 10:15
編集2020/07/13 12:38総合スコア8760
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/08 12:45