7

所以我刚开始在 Linux 上使用 Python,使用 Tkinter。我正在尝试使用 KeyboardInterrupt Exception 使 Cntrl+C 停止执行,但是当我按下它时,暂时没有任何反应。最终它“接受”并退出。一点点阅读表明这可能与线程或其他东西有关,但我对这些东西太陌生了,我真的不知道从哪里开始。

#! /usr/bin/python
import sys
from Tkinter import *

try: 
    root = Tk()
    root.mainloop()
except:
    print "you pressed control c"
    sys.exit(0)

我讨厌成为只想要快速修复的菜鸟,所以如果你的答案就像将我指向正确的文档一样简单,那就太好了。

4

2 回答 2

9

这有点问题,因为一般来说,在调用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()
于 2012-12-09T03:17:04.517 回答
1

根据 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()
于 2012-12-09T03:20:40.373 回答