我的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_())
Run Code Online (Sandbox Code Playgroud)
test.ui包含QPushButton和标签.当我在非Qt应用程序中调用testfunc(显然会出现错误)时,我会收到错误消息,回溯等.当我执行此代码时,它只是退出.
之前我没有使用QtDesigner写了一个PyQt应用程序,它按预期将错误打印到控制台.与QtDesigner和继承有什么区别?
看看下面的MWE。
import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.button = QPushButton('Bham!')
self.setCentralWidget(self.button)
self.button.clicked.connect(self.btnClicked)
def btnClicked(self):
print(sys.excepthook)
raise Exception
#import traceback
#sys.excepthook = traceback.print_exception
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
我有很多问题。我不知道它们是否都相关(我想是的),如果它们不相关,请原谅我。
当我从终端运行以上代码时,一切都很好。该程序运行,如果我单击按钮,它将打印回溯并消失。如果我在IDE(我测试过Spyder和PyCharm)中运行它,则不会显示回溯。知道为什么吗?从本质上讲,在此处和此处的其他帖子中也提出了相同的问题。请不要将此标记为其中任何一个的重复;请继续阅读。
通过添加注释行,可以再次正确显示回溯。但是,它们还具有讨厌的副作用,即该应用程序不会再因未处理的异常而终止!我不知道为什么会这样,因为AFAIK excepthook仅打印回溯,它不能阻止程序退出。目前,救援已经为时已晚。
另外,我不了解Qt在这里如何发挥作用,因为未在插槽内引发的异常仍会像我期望的那样使应用程序崩溃。无论我是否进行更改excepthook,PyQt似乎都不会覆盖它(至少print似乎暗示了这一点)。
仅供参考,我正在将Python 3.5与PyQt 5.6配合使用,并且我知道PyQt 5.5中引入的异常处理方面的变化。如果确实是上述行为的原因,我很高兴听到一些更详细的解释。