2017-05-04 7 views
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() 

問題::

  1. それが現在ルートウィンドウを閉じるには、現状では、プロセスが停止しないここでは、コードです。それは走り続ける。 mainerスレッドに対してisalive()を印刷する無限ループを追加しても、それはTrueと続きます。 なぜ終了しないのですか?
  2. 私はmainer機能でprint(kill)ステートメントを追加する場合には、私は2つの結果の1を取得:maintext.set()声明、ウィンドウを終了するには、印刷停止が実行さばかりが、それでもスレッド上に書かれている場合
    1. を終了しません。非常にまれにしかありません。私は、quit関数が実行されたときに関数がどの行にあったかに依存していると仮定しています。
    2. この文の下に書かれている場合、終了するとスレッドはほぼ必然的に終了します。

私はここで何が起こっているのか見当もつかない。どんな助けもありがとうございます。

+0

あなたは 'time.sleepを(追加しようとしています) 'あなたのループで?多分、たぶん、スレッドがコマンドをtkinterに送信するにはビジー状態です。 –

+1

@ Jean-FrançoisFabre私はその振る舞いの背後にある論理を理解したい。なぜそれが必要なのでしょうか?実際のプロジェクトではUSBシリアルからの読み込みが必要ですが、 'time.sleep()'は遅延を引き起こしませんか? –

+1

@ Jean-FrançoisFabreこの場合、print(kill文)をどこに置いても、同じ結果が出るはずです。 –

答えて

0

あなたがスレッドメインスレッドが死ぬとき、あなたがすべてで終了ロジックのいずれかを必要としないので、それは、死んでしまうデーモン作る場合:

from tkinter import * 
from threading import * 
import time 

def mainer(): 
    while True: 
     maintext.set(value='bbb') 
    time.sleep(.1) # just so my CPU does not rail 

root=Tk() 
maintext=StringVar(value='aaa') 
t = Thread(target=mainer) 
t.daemon = True 
t.start() 
root.mainloop()