【发布时间】:2017-05-04 14:36:09
【问题描述】:
我正在尝试使用线程来创建并发执行的任务的 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()
问题:
- 就目前而言,在关闭根窗口时,进程不会停止。它继续运行。即使我为
mainer线程添加了一个无限循环来打印isalive(),它也会一直显示True。 为什么不退出? - 如果我在
mainer函数中添加print(kill)语句,我会得到以下两种结果之一:- 如果写在
maintext.set()语句上方,在退出窗口时,打印停止执行,但线程仍然没有退出。非常罕见,它确实如此,我假设这必须取决于执行退出函数时函数所在的行。 - 如果写在该语句下方,则在退出时,线程几乎不可避免地会退出。
- 如果写在
我不知道这里发生了什么。任何帮助表示赞赏。
【问题讨论】:
-
您是否尝试在循环中添加
time.sleep()?也许,只是也许,线程太忙于向 tkinter 发送命令。 -
@Jean-FrançoisFabre 我想了解行为背后的逻辑。为什么有必要这样做?而且实际项目需要从USB串口读取,
time.sleep()不会造成延迟吗? -
@Jean-FrançoisFabre 在这种情况下,无论我将
print(kill语句放在哪里,我都应该得到相同的结果? -
这让我想起了一些事情:我认为从线程执行 GUI 操作是不安全的。我不知道 tkinter,但
wxWidgets有一个callAfter方法,它要求主线程执行操作。在子线程中执行操作会导致未定义的行为
标签: python multithreading python-3.x debugging tkinter