tkinter:KeyboardInterrupt 需要一段时间

9

在Linux上使用Python的Tkinter,我试图通过使用KeyboardInterrupt异常使Ctrl+C停止执行,但是当我按下它时,一段时间内什么也不会发生。最终它“接受”并退出。示例程序:

import sys
from Tkinter import *

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

如何让程序反应更快?

值得注意的是,我已经尝试过except:except KeyboardInterrupt:,但都没有起作用。 - Thomas Shields
我注意到异常直到我聚焦TKinter窗口时才被抛出。 - emil
@emil 同感;我只需要将鼠标移到上面就可以了... 至少现在这让我的开发更容易了,但这是一个有趣的事件。 - Thomas Shields
这是matplotlib中未解决的问题url - user3804598
2个回答

10

这有点棘手,因为通常情况下,在调用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()

谢谢,特别是对问题的解释。我有点猜到Tcl已经接管了,但我不确定,也不知道该如何干预。谢谢! - Thomas Shields
补充一下评论:聚焦Tkinter窗口会发出需要处理的事件,因此可以利用这个机会来处理其他待处理的事件。 - mmgp

0

根据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()

8
只有当你当前的焦点在Tkinter窗口上时,才能起到作用,然后在那里按下control-c。这并不能解决在shell中按下control-c的情况。 - mmgp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接