python pyqt pycharm qt-designer pyqt5

python - PyQt: Sin mensaje de error(rastreo) al salir



pycharm qt-designer (1)

Esto probablemente se deba a cambios en la forma en que se tratan las excepciones en PyQt-5.5. Para citar los documentos de PyQt5 :

En PyQt v5.5, una excepción Python no controlada generará una llamada a la función qFatal () de Qt. Por defecto, esto llamará a abort () y la aplicación finalizará. Tenga en cuenta que un enlace de excepción instalado de la aplicación seguirá teniendo prioridad.

Cuando ejecuto su ejemplo en una consola normal, esto es lo que veo:

$ 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)

Entonces, la principal diferencia es que la aplicación ahora abortará inmediatamente cuando encuentre una excepción no controlada (es decir, como lo haría un script de Python normal). Por supuesto, aún puede controlar este comportamiento mediante el uso de un bloque try/except o globalmente anulando sys.excepthook .

Si no ve ningún rastreo, esto puede deberse a un problema con el IDE de Python que está utilizando para ejecutar su aplicación.

PD:

Como mínimo, el antiguo comportamiento PyQt4 de simplemente imprimir el rastreo a stdout / stderr se puede restaurar de esta manera:

def except_hook(cls, exception, traceback): sys.__excepthook__(cls, exception, traceback) if __name__ == "__main__": import sys sys.excepthook = except_hook

Mi aplicación PyQt ya no imprime el error (stderr?) En la consola.

Uso QtDesigner e importo la interfaz de usuario de esta manera:

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 contiene un QPushButton y una etiqueta. Cuando llamo a testfunc (que obviamente da un error) en una aplicación que no es Qt, recibo el mensaje de error, rastreo, etc. Cuando ejecuto este código, simplemente sale.

Escribí una aplicación PyQt sin QtDesigner antes e imprimió los errores en la consola como se esperaba. ¿Cuál es la diferencia con QtDesigner y la herencia?