Ctrl-C/SIGTERM/SIGINT似乎被tkinter忽略了。通常可以通过回调重新捕获。但是这似乎没有起作用,所以我想在另一个线程中运行tkinter,因为它的mainloop()是一个无限循环并且会阻塞。我实际上还想在单独的线程中从stdin读取。即使在此之后,直到关闭窗口,Ctrl-C仍然无法处理。这是我的MWE:
#! /usr/bin/env python
import Tkinter as tk
import threading
import signal
import sys
class MyTkApp(threading.Thread):
def run(self):
self.root = tk.Tk()
self.root.mainloop()
app = MyTkApp()
app.start()
def signal_handler(signal, frame):
sys.stderr.write("Exiting...\n")
# think only one of these is needed, not sure
app.root.destroy()
app.root.quit()
signal.signal(signal.SIGINT, signal_handler)
结果:
- 运行应用程序
- 在终端中按Ctrl-C(没有任何反应)
- 关闭窗口
- 打印“Exiting...”并出现关于循环已经退出的错误。
这里发生了什么,我该如何使终端中的Ctrl-C关闭应用程序?
更新:添加投票,如建议所述,在主线程中运行正常,但在另一个线程中启动无效...
class MyTkApp(threading.Thread):
def poll(self):
sys.stderr.write("poll\n")
self.root.after(50, self.poll)
def run(self):
self.root = tk.Tk()
self.root.after(50, self.poll)
self.root.mainloop()