PyQt: 退出时无错误信息 (追踪)

2024-03-28 14:41:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我使用QtDesigner并导入用户界面,如下所示:

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_())

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

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


Tags: fromimportself应用程序uimain错误sys
1条回答
网友
1楼 · 发布于 2024-03-28 14:41:51

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

In PyQt v5.5 an unhandled Python exception will result in a call to Qt’s qFatal() function. By default this will call abort() and the application will terminate. Note that an application installed exception hook will still take precedence.

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

$ 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出现问题所致。

附言:

至少,简单地将回溯打印到stdout/stderr的旧PyQt4行为可以恢复如下:

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

if __name__ == "__main__":

    import sys
    sys.excepthook = except_hook

相关问题 更多 >