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