0
私は同時に実行されたタスクを作成するためにスレッドを使用しているGUIアプリケーションを試しています。奇妙なスレッドのtkinterでの終了動作
from tkinter import *
from threading import *
import time
kill = False
def mainer():
global kill
while not kill:
maintext.set(value='bbb')
def quitfunc():
global kill
kill = True
time.sleep(2)
root.destroy()
root=Tk()
maintext=StringVar(value='aaa')
Thread(target=mainer).start()
root.protocol("WM_DELETE_WINDOW", quitfunc)
root.mainloop()
問題::
- それが現在ルートウィンドウを閉じるには、現状では、プロセスが停止しないここでは、コードです。それは走り続ける。
mainer
スレッドに対してisalive()
を印刷する無限ループを追加しても、それはTrue
と続きます。 なぜ終了しないのですか? - 私は
mainer
機能でprint(kill)
ステートメントを追加する場合には、私は2つの結果の1を取得:maintext.set()
声明、ウィンドウを終了するには、印刷停止が実行さばかりが、それでもスレッド上に書かれている場合- を終了しません。非常にまれにしかありません。私は、quit関数が実行されたときに関数がどの行にあったかに依存していると仮定しています。
- この文の下に書かれている場合、終了するとスレッドはほぼ必然的に終了します。
私はここで何が起こっているのか見当もつかない。どんな助けもありがとうございます。
あなたは 'time.sleepを(追加しようとしています) 'あなたのループで?多分、たぶん、スレッドがコマンドをtkinterに送信するにはビジー状態です。 –
@ Jean-FrançoisFabre私はその振る舞いの背後にある論理を理解したい。なぜそれが必要なのでしょうか?実際のプロジェクトではUSBシリアルからの読み込みが必要ですが、 'time.sleep()'は遅延を引き起こしませんか? –
@ Jean-FrançoisFabreこの場合、print(kill文)をどこに置いても、同じ結果が出るはずです。 –