【问题标题】:Ctrl-C doesn't work with PyQt [duplicate]Ctrl-C 不适用于 PyQt [重复]
【发布时间】:2011-07-06 20:15:51
【问题描述】:

为什么 Ctrl+C 不能破坏使用 PyQt 的 Python 程序?我想调试它并获取堆栈跟踪,由于某种原因,这比使用 C++ 更难!

【问题讨论】:

标签: python pyqt


【解决方案1】:

CTRL+C 使信号发送到 过程。 Python 抓住了 信号,并设置一个全局变量, 类似 CTRL_C_PRESSED = True。 然后,每当 Python 解释器 开始执行一个新的操作码,它看到 变量设置并引发 键盘中断。

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

这都是设计使然:CTRL+C 的意思是 做一个“干净的中止”;这就是为什么 被变成异常 Python(以便清理 在堆栈展开期间执行),及其 扩展模块的支持是排序 的“选择加入”。如果你想完全 中止进程,而不给它一个 清理的机会,你可以使用CTRL+。

当 Python 调用 QApplication::exec() (C++函数),Qt不知道 如何与 Python “合作” CTRL+C,这就是为什么它不 工作。我觉得没有什么好办法 “让它发挥作用”;你可能想看看 如果你能通过全局处理它 事件过滤器。 — 乔瓦尼·巴霍

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

import signal

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

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

【讨论】:

  • 我不知道这是做什么的,但它确实工作得很好!编辑:阅读一下here,它说,SIGINT (=Ctrl+C) 应该执行默认操作 (=quit)。
【解决方案2】:

我同意 Neil G 的观点,并会补充:

如果你调用 QApplication.exec_() 来启动事件循环,而是在交互式 python shell 中执行你的程序(使用 python -i),那么 pyqt 将在任何时候自动处理事件交互式提示正在等待,Ctrl-C 应该再次按预期运行。这是因为 Qt 事件循环将与 python 解释器共享时间,而不是独占运行,从而使解释器有机会捕获这些中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多