【发布时间】:2016-01-31 12:06:01
【问题描述】:
我正在为项目作业编写此软件,但在混合线程和 tkinter 时遇到问题。 以下部分大部分都按预期工作,但是当我关闭它时(在 Python shell 中启动它之后),windows 显示错误:“Python 停止工作”。
import threading
import time
import tkinter
import tkinter.ttk
class BTClient:
def __init__(self, master):
self.root = master
self.root.bind("<Destroy>", self.on_destroy)
self.t = threading.Thread(target=self.update)
self.running = False
def on_destroy(self, event):
self.running = False
def run_thread(self):
self.running = True
self.t.start()
def update(self):
while self.running:
print("Update.")
time.sleep(1)
def main(args):
root = tkinter.Tk()
client = BTClient(root)
client.run_thread()
root.mainloop()
if __name__ == "__main__":
import sys
main(sys.argv)
我该如何解决这个问题?它是由我使用的设计引起的吗?我应该改变它吗?
编辑 1: 当我删除 __init__ 中的 self.root 声明并仅使用 master 引用时,问题已解决,但我需要首先引用 GUI 对象构建 GUI 并从他们那里获取输入,所以我不知道如何解决这个问题。也许将对象作为参数传递给可能需要它们的所有东西?
【问题讨论】:
-
你有没有尝试将线程封装在try/except中,看看错误信息是什么?我没有 tkinter 经验,但是在 wxpython 中出现了类似的问题,因为线程在关闭后尝试访问窗口。
-
也许尝试将线程设置为守护进程 self.t.setDaemon(True)
-
如果我将它设置为守护进程,线程会在主线程之后立即死亡,对吗?没有任何清理,我认为我需要这样做。
-
是的。尝试将线程方法移到 BTClient 类之外,并添加 try/except 子句
-
我假设当窗口关闭时,它会删除 BTClient 实例并且您的线程仍然需要该实例(self.running),因此它会抛出错误
标签: python multithreading tkinter