PyQt:退出时没有错误消息(traceback)

19

我的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,还是自己编译的? - Daniele Pantaleone
我使用了这个预编译的64位二进制文件:https://riverbankcomputing.com/software/pyqt/download5 - Jannis
我猜那就是问题所在。我曾经也遇到同样的问题,所以我从源代码重新安装了 PyQt5,并使用 mingw32 进行编译,现在一切都正常工作了。 - Daniele Pantaleone
我在编译时遇到了问题,所以我回滚到了早期版本(5.4.1而不是5.5.1)。这样做解决了问题。错误消息又出现了,我可以正确地调试我的应用程序。谢谢! - Jannis
@Jannis 如何回滚到以前的版本?它们在哪里可以找到? - bkr879
@wit221 你可能已经找到了这些:https://sourceforge.net/projects/pyqt/files/PyQt5/ - Jannis
2个回答

44

这可能是由于PyQt-5.5中异常处理方式的变化所致。引用自PyQt5文档

在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运行应用程序存在问题。

附:

至少可以通过以下方式恢复旧的PyQt4行为,即简单地将回溯信息打印到stdout/stderr:

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

if __name__ == "__main__":

    import sys
    sys.excepthook = except_hook

谢谢回复!是的,当我使用try/except块时,应用程序没有终止。我不认为这是IDE的问题。对于非GUI测试,我仍然有traceback,并且我尝试了pycharm和eclipse。而且,在旧版PyQt中,traceback按照我想要的方式工作。在PyQt5.5中,如果我以“调试模式”运行程序,仍然可以看到traceback。但那真的很慢。在最新更新之后,您应该如何调试PyQt5.5应用程序? - Jannis
1
@Jannis。但这听起来像是那些IDE的问题,不是吗?正如我在我的回答中所示,当我在控制台中运行您的脚本时,traceback确实被显示出来。那么为什么您的IDE不能这样做呢?我自己从未使用过IDE,并且总是在我的程序中设置一个excepthook-因此,在调试方面对我来说没有太大变化。 - ekhumoro
你说得对,我没有仔细阅读你的评论。我重新安装了PyQt5.5来测试。在控制台中,我得到了与你相同的输出。但在pycharm和eclipse中,回溯信息却没有显示出来。对于PyQt5.5,它们不会显示回溯信息,而对于PyQt5.4.1则会显示。我在两者之间没有更改任何选项。我很快就会研究使用excepthooks。现在我对普通的回溯信息感到满意。 - Jannis
@ekhumoro 我在使用PyQT 5.7时,遇到了和Eclipse以及Visual Studio Code相同的问题。你知道是否有任何IDE能够显示错误跟踪信息吗?谢谢。 - bkr879
@wit221。我自己从未使用过IDE,所以无法真正推荐一个。然而,Eric Python IDE是用PyQt编写的,所以如果它不能正确处理追溯信息,我会感到惊讶的。 - ekhumoro
显示剩余4条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接