在Linux上使用Tkinter和Python,我试图通过使用KeyboardInterrupt
异常使Ctrl + C停止执行,但是当我按下它时,有一段时间没有任何反应。最终它"接受"并退出。 示例程序:
import sys
from Tkinter import *
try:
root = Tk()
root.mainloop()
except:
print("you pressed control c")
sys.exit(0)
程序如何更快地做出反应?
这有点问题,因为一般来说,在调用 mainloop
方法之后,您依赖于 Tcl 来处理事件。由于您的应用程序什么都不做,因此 Tcl 没有理由对任何事情做出反应,尽管它最终会处理其他事件(正如您所注意到的,这可能需要一些时间)。规避这种情况的一种方法是让 Tcl/Tk 做一些事情,调度人工事件,如下所示:
from Tkinter import Tk
def check():
root.after(50, check) # 50 stands for 50 ms.
root = Tk()
root.after(50, check)
root.mainloop()
根据Guido van Rossum的说法,这是因为你被困在Tcl/Tk主循环中,而信号处理程序仅由Python解释器处理。
可以通过将 Ctrl-c 绑定到回调函数来解决此问题:
import sys
import Tkinter as tk
def quit(event):
print "you pressed control c"
root.quit()
root = tk.Tk()
root.bind('<Control-c>', quit)
root.mainloop()