Jan*_*nis 13 python pyqt qt-designer pycharm 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_())
Run Code Online (Sandbox Code Playgroud)
test.ui包含QPushButton和标签.当我在非Qt应用程序中调用testfunc(显然会出现错误)时,我会收到错误消息,回溯等.当我执行此代码时,它只是退出.
之前我没有使用QtDesigner写了一个PyQt应用程序,它按预期将错误打印到控制台.与QtDesigner和继承有什么区别?
ekh*_*oro 25
这可能是由于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)
Run Code Online (Sandbox Code Playgroud)
所以主要区别在于应用程序现在会在遇到未处理的异常时立即中止(就像普通的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7257 次 |
| 最近记录: |