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

时间:2015-11-16 13:42:17

标签: python pyqt pycharm qt-designer pyqt5

我的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和继承的区别是什么?

1 个答案:

答案 0 :(得分:21)

这可能是由于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