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?