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

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

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

推荐答案

这可能是因为PyQt-5.5中处理异常的方式发生了变化.引用PyQt5 Docs人的话:

在PyQt v5中.5未经处理的Python异常将导致调用

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

$ 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

Python-3.x相关问答推荐

math. gcd背后的算法是什么,为什么它是更快的欧几里得算法?

使用PANAS根据另两个列表中的值对一个列表中的字符串值进行分组

动态范围内来自另外两列的列求和

为什么我无法在django中按月筛选事件?

AddMultplicationEquality() 用于多个变量

查找值始终为零的行 pandas

Heroku 中的未知错误代码缺少一个或多个参数

以特定方式重新排列 pandas 数据框的列

如何获取实例化 `types.GenericAlias` 的下标类?

Pytest顺序测试A,然后测试B,然后再测试A

使用 python 查找标记的元素

attrs 将 list[str] 转换为 list[float]

Python:如何在Pandas 的 .agg 函数中使用 value_counts()?

Python ** 用于负数

错误:预期语句,发现 py:Dedent

Python 3x 的最佳机器学习包?

Python 的 unittest 和 unittest2 模块有什么区别?

如何使用请求发送带有标头的 PATCH 请求

通过字典有效地替换Pandas 系列中的值

如何阻止散景在 Jupyter Notebook 中打开新标签?