【发布时间】:2014-05-08 22:31:14
【问题描述】:
我有一个带有 Tkinter GUI 的 Python 应用程序。在应用程序中,用户调用一个长时间运行的后台进程(作为来自 Python 的 threading 模块的 Thread 实现)。如果我在程序完成之前退出程序,我将无法杀死后台线程。 如果我通过顶部角落的“X”关闭根窗口来退出应用程序,我的代码可以工作,但如果我从顶级菜单栏退出(即 Python > Quit 或 Ctrl+Q)则不能强>。由于大多数应用程序都使用后者,我真的很想实现它。
现在,我使用如下代码杀死后台线程:
class BackgroundCallFrame(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.background_call = BackgroundCall()
self.background_call.start()
class BackgroundCall(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self._stop_req = threading.Event()
def run(self):
for i in range(1,100000):
if self._stop_req.is_set():
return
else:
# do stuff
def stop(self):
self._stop_req.set();
def main():
def kill_all_threads():
if child.background_call is not None:
child.background_call.stop()
child.background_call.join()
root.destroy()
root = Tk()
root.wm_protocol ("WM_DELETE_WINDOW", kill_all_threads)
child = BackgroundCallFrame()
child.pack()
root.mainloop()
if __name__ == '__main__':
main()
如果我在没有先明确关闭根窗口的情况下退出程序,我该如何完成这项工作?
我相信我的问题是当我调用 Ctrl+Q 时没有调用 kill_all_threads(),因为我添加到其中的任何打印语句都不会出现在控制台中。
【问题讨论】: