当前位置: 首页 > 面试题库 >

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

缪风史
2023-03-14
问题内容

我的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-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出现问题。

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/catch块中有三个sql查询。Autocommit是关闭的,并且所有三个查询都没有错误地运行,我已经验证了这一点(如果任何查询失败,它应该不会到达commit行,但是我已经通过xdebug验证了它,一次单步执行代码一行)。当代码到达commit()函数调用时,mysqli返回false,但没有错误消息。当前面的查询都工作时,提交怎么会失败呢? 代码基本上是这样的:

  • 即时创建一个小电子邮件脚本与PHPMailer SMTP身份验证。我现在试着用错误的密码发送一封电子邮件——但它仍然会给成功带来“真实”的回报...有人知道吗?' 以下是我用来调用sendmail的函数: 这是我的PHPMailer函数 $smtp包含一个数组,其中包含所有SMTP信息、电子邮件地址、签名、Smtp服务器、端口、用户名、密码和SSL用法... 我敢肯定,我使用了错误的用户名和密码,

  • 问题内容: 我刚刚下载并解封了适用于Windows的android SDK。我目前正在使用W8 64x。 问题答案: 该错误消息指出你的Java版本有问题。你是否安装了JDK? 尝试添加以下内容(注意新行): /!\确保该-vm选项位于命令之前-vmargs。之后的所有内容都-vmargs直接传递给JVM。 …指向你的文件,指向要使用的JDK,并检查所需的Java版本是否至少与你的JDK一样新。这

  • 我有以下用于自定义约束的代码:

  • 好的,所以我试图安装一个新的jdk/jre,突然我的eclipse将无法打开。我试着卸载旧形式的java并重新安装我需要的java,但它拒绝打开。我已经在谷歌上搜索了这个,并在网上尝试了十几个答案,但没有一个对我有效。这是极其令人沮丧的。想法?

  • 我在使用discord机器人添加此发送消息时遇到了一个奇怪的错误。我在学习Scratch教程 结果:- `(节点:8480)未经处理的PromisejectionWarning:DiscordAPIError:在C:\Users\Deepanshu\node\u modules\discord处缺少访问权限。js\src\client\rest\RequestHandlers\Sequential