【问题标题】:PyQt: No error msg (traceback) on exitPyQt:退出时没有错误消息(回溯)
【发布时间】:2016-02-17 15:16:25
【问题描述】:

我的 PyQt 应用程序不再将错误(stderr?)打印到控制台。

我使用 QtDesigner 并像这样导入 UI:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.uic import loadUiType
Ui_MainWindow, QMainWindow = loadUiType("test.ui")

class Main(QMainWindow, Ui_MainWindow):
    """Main window"""
    def __init__(self,parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.testfunc)

   def testfunc(self):
        print(9/0)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main = Main()
    main.show()
    sys.exit(app.exec_())

test.ui 包含一个 QPushButton 和一个标签。当我在非 Qt 应用程序中调用 testfunc(这显然会给出错误)时,我会收到错误消息、回溯等。当我执行此代码时,它就退出了。

我之前编写了一个没有 QtDesigner 的 PyQt 应用程序,它按预期将错误打印到控制台。 QtDesigner和继承有什么区别?

【问题讨论】:

  • 您是使用预编译的二进制文件安装 PyQt,还是自己编译?
  • 我使用了这个预编译的 64 位二进制文​​件:riverbankcomputing.com/software/pyqt/download5
  • 我想这就是问题所在。我遇到了同样的问题,所以我从源代码重新安装了 PyQt5,使用 mingw32 编译它,现在一切正常。
  • 我在编译它时遇到了麻烦,所以我只是回滚到早期版本(5.4.1 而不是 5.5.1)。这成功了。错误消息又回来了,我可以正确调试我的应用程序。谢谢!
  • @Jannis 如何回滚到以前的版本?在哪里可以找到这些?

标签: python python-3.x pyqt pyqt5 qt-designer


【解决方案1】:

这可能是由于 PyQt-5.5 中处理异常的方式发生了变化。引用PyQt5 Docs

在 PyQt v5.5 中,未处理的 Python 异常将导致调用 Qt 的 qFatal() 函数。默认情况下,这将调用 abort() 和 应用程序将终止。请注意,安装的应用程序 异常挂钩仍将优先。

当我在普通控制台中运行您的示例时,我看到的是:

$ python test.py
Traceback (most recent call last):
  File "test.py", line 213, in testfunc
    print(9/0)
ZeroDivisionError: division by zero
Aborted (core dumped)

所以主要区别在于应用程序现在会在遇到未处理的异常时立即中止(即就像普通的 python 脚本一样)。当然,您仍然可以通过使用try/except 块或通过覆盖sys.excepthook 来全局控制此行为。

如果您没有看到任何回溯,这可能是由于您用于运行应用程序的 Python IDE 存在问题。

PS:

作为最低限度,简单地将回溯打印到 stdout/stderr 的旧 PyQt4 行为可以这样恢复:

def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)

if __name__ == "__main__":

    import sys
    sys.excepthook = except_hook

【讨论】:

  • 感谢您的回复!是的,当我使用 try/except 块时,应用程序没有终止。我认为这不是 IDE 的问题。对于非 GUI 测试,我仍然有回溯,我用 pycharm 和 eclipse 都试过了。并且对于较旧的 PyQt 版本,回溯可以按我的意愿工作。如果我在“调试模式”下运行程序,PyQt5.5 仍然可以看到回溯。不过那真的很慢。在最新更新后,您应该如何调试 PyQt5.5 应用程序?
  • @Jannis。但这确实听起来像是那些 IDE 的问题,不是吗?正如我在回答中所展示的,当我在控制台中运行您的脚本时,会显示回溯 is 。那么为什么你的 IDE 不能这样做呢?我自己从来没有使用过 IDE,并且总是在我的程序中设置一个异常挂钩 - 所以在调试方面对我来说没有什么太大的变化。
  • 你说得对,我没有仔细阅读你的评论。我重新安装了 PyQt5.5 来测试它。在控制台中,我得到与您相同的输出。在 pycharm 和 eclipse 中,回溯都没有出现。他们没有显示 PyQt5.5 的回溯,而他们确实显示了 PyQt5.4.1。我没有在两者之间更改任何选项。我很快就会考虑使用异常钩子。现在我对正常的回溯很满意。
  • Spyder 也不显示回溯。这是处理这种行为的正确方法吗? gist.github.com/Winand/e98e3f2f073826b7c08b58fb6d338b51
  • @Winand。你应该问问 Spyder 的开发者。
猜你喜欢
  • 2012-09-10
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多