2009-08-30 30 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