奇怪的线程与tkinter退出行为

时间:2017-05-04 14:36:09

标签: python multithreading python-3.x debugging tkinter

我正在尝试一个GUI应用程序,我在其中使用线程来创建并发执行的任务。这是代码:

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. 目前看来,在关闭根窗口时,流程不会停止。它一直在运行。即使我为isalive()线程添加无限循环来打印mainer,它仍然会说True为什么不退出?
  2. 如果我在print(kill)函数中添加mainer语句,我会得到两个结果之一:
    1. 如果在maintext.set()语句上方写入,则在退出窗口时,打印停止执行但线程仍未退出。很少,它确实如此,我假设它必须取决于执行退出函数时函数所在的行。
    2. 如果写在该语句下面,退出时,线程几乎不可避免地退出。
  3. 我不知道这里发生了什么。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

如果你让线程成为一个守护进程,它会在主线程死掉时死掉,所以你根本不需要任何退出逻辑:

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()