PyQt: no hay error msg (rastreo) en la salida

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

Utilizo QtDesigner e importe 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, el rastreo, etc. Cuando ejecuto este código, simplemente se cierra.

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?

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

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

Cuando ejecuto tu 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) 

Por lo tanto, la principal diferencia es que la aplicación ahora se cancelará inmediatamente cuando se 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 utilizando un bloque try/except o globalmente anulando sys.excepthook .

Si no está viendo 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 de PyQt4 de simplemente imprimir el rastreo a stdout / stderr se puede restaurar de la siguiente manera:

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