2009-08-30 33 views
2

我正在研究一个PyKDE4/PyQt4应用程序Autokey,我注意到当我发送一个CTRL + C的程序时,键盘中断不会被处理,直到我与应用程序交互,即按ie。点击菜单项或更改复选框。在KDE Python应用程序中处理KeyboardInterrupt?

[email protected]:~$ /usr/bin/autokey 
^C^C^C 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/dist-packages/autokey/ui/popupmenu.py", line 113, in on_triggered 
    def on_triggered(self): 
KeyboardInterrupt 
^C^C^C 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/dist-packages/autokey/ui/configwindow.py", line 423, in mousePressEvent 
    def mousePressEvent(self, event): 
KeyboardInterrupt 

尽管这是具有下列在/ usr/bin中/自动密钥:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import sys 
from autokey.autokey import Application 

a = Application() 
try: 
    a.main() 
except KeyboardInterrupt: 
    a.shutdown() 
sys.exit(0) 

为什么没有一个KeyboardInterrupt抓到:

  • 当我发出了它,而不是当我接下来通过最初的try/except子句在GUI
  • 中采取行动?

使用Python 2.6运行Ubuntu 9.04。

+0

如果sig尽快被捕获,那么它显示KeyboardInterrupt没有被提出的原因是你在Qt中的基于C的事件循环中,并且Python解释器没有机会注册^ C直到事件循环的下一次。 – 2009-08-31 15:36:57

+0

我更新了我的答案。 – 2009-08-31 21:06:42

回答

4

尝试这样做:

import signal 
signal.signal(signal.SIGINT, signal.SIG_DFL) 

调用a.main()之前。

更新:请记住,Ctrl-C可用于在GUI应用程序中复制。最好在Qt中使用Ctrl + \,这会导致事件循环终止并关闭应用程序。

+0

是的,信号然后被捕获。要我粘贴a.main()的内容? – lfaraone 2009-08-31 13:57:38

+0

好的。有没有一种方法可以改变它,以便CTRL + C可以像几乎所有其他UNIX应用程序一样工作? – lfaraone 2009-09-03 14:44:20

+0

就像一个说明:例如在德语键盘上,您不能按Ctrl + \,因为\ os已经是一个按键序列(Alt Gr +ß)。 – panzi 2011-11-12 02:55:54