2017-05-04 48 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)聲明,我得到兩個結果之一:
    1. 如果上述maintext.set()聲明寫到,在退出窗口,打印停止得到執行,但螺紋仍不退出。非常非常罕見,它的確如此,我假設它必須取決於執行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()