如何使用PyQt在python应用程序中处理Ctrl + C?

时间:2017-03-15 15:28:11

标签: python pyqt signals pyqt4

我有一个基于PyQt4的python 2.7应用程序。我需要在特定的处理程序中处理Ctrl + C(KeyboardInterruptSIGINT,2)。我看到通过按Ctrl + C创建的异常没有被try-except块捕获,并且在signal库注册的处理函数中没有看到。 Ctrl + C什么都不做! 我试图在没有PyQt的情况下做同样的事情 - signal效果很好 用于测试的代码不使用任何PyQt API,因此我可以在两种情况下都检查它。

1 个答案:

答案 0 :(得分:1)

  

CTRL + C会将信号发送到进程。 Python捕获信号,并设置一个全局变量,如CTRL_C_PRESSED = True。然后,每当Python解释器执行一个新的操作码时,它就会看到变量集并引发一个KeybordInterrupt。

     

这意味着CTRL + C仅在Python解释器正在旋转时才起作用。如果解释器正在执行用C编写的执行长时间运行操作的扩展模块,则CTRL + C不会中断它,除非它明确地"合作"用Python。例如:time.sleep()理论上是一个阻塞操作,但该函数的实现"合作"使用Python解释器使CTRL + C工作。

     

这完全是设计的:CTRL + C意味着做一个"干净的中止&#34 ;;这就是它被Python变成异常的原因(以便在堆栈展开期间执行清理),并且它对扩展模块的支持有点像选择"选择加入"。如果你想彻底中止这个过程,而不给它一个清理的机会,你可以使用CTRL +。

     

当Python调用QApplication :: exec()(C ++函数)时,Qt不知道如何"合作"用于CTRL + C的Python,这就是为什么它不起作用。我不认为这是一个很好的方法,可以让它发挥作用&#34 ;;您可能想看看是否可以通过全局事件过滤器处理它。 - Giovanni Bajo

将其添加到主程序解决了这个问题。

import signal

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

我不确定这与解释有什么关系。