首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python应用程序中使用Ctrl+C处理PyQt?

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

Stack Overflow用户
提问于 2017-03-15 15:28:10
回答 1查看 1.8K关注 0票数 1

我有一个基于PyQt4的python2.7应用程序。我需要在特定的处理程序中处理Ctrl+C (KeyboardInterruptSIGINT,2)。我看到通过点击Ctrl+C创建的异常没有在try-except块中捕获,也没有在signal库注册的处理程序函数中看到。Ctrl+C什么都不做!

我也尝试过在没有PyQt的情况下做同样的事情-- signal效果很好。

用于测试的代码不使用任何PyQt API,因此在这两种情况下我都可以使用它进行检查。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-15 15:30:05

CTRL+C会导致向进程发送信号。Python捕获信号,并设置一个全局变量,类似于CTRL_C_PRESSED = True。然后,每当Python解释器执行新的操作码时,它就会看到变量集并引发一个KeybordInterrupt。 这意味着CTRL+C只有在Python解释器正在旋转时才能工作。如果解释器正在执行用C编写的扩展模块,该扩展模块执行长时间运行的操作,CTRL+C不会中断它,除非它与Python显式地“合作”。从理论上讲,time.sleep()是一种阻塞操作,但该函数的实现与Python解释器“合作”,以使CTRL+C工作。 这一切都是由设计完成的: CTRL+C的目的是进行“干净中止”;这就是为什么它会被Python转换为异常(以便在堆栈解除时执行清理),扩展模块对它的支持也算是“选择-in”。如果您想完全中止进程,而不给它一个清理的机会,您可以使用CTRL+。 当Python调用QApplication::exec() ( C++函数)时,Qt不知道如何与PythonforPythonforCTRL+C“合作”,这就是它不能工作的原因。我不认为有一个好的方法来“使它工作”,你可能想看看你是否可以通过全局事件过滤器来处理它。-乔瓦尼·巴霍

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

代码语言:javascript
复制
import signal

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

我不知道这和解释有什么关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42814093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档