Ctrl-C不适用于PyQt

Nei*_*l G 18 python pyqt

为什么不Ctrl+ C断裂功使用PyQt的Python程序?我想调试它并获得堆栈跟踪,出于某种原因,这比使用C++更难!

Nei*_*l G 29

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

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

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

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

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

import signal

signal.signal(signal.SIGINT, signal.SIG_DFL)
Run Code Online (Sandbox Code Playgroud)

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

  • 我不知道这是做什么的,但是它确实可以正常工作!编辑:在[这里](https://docs.python.org/3/library/signal.html)阅读一点有关它的内容,它说SIGINT(= Ctrl + C)应该执行默认操作(= quit) 。 (3认同)