Как после падения главного окна PyQt5 с ошибкой вызвать сообщение с текстом об ошибке?
У меня есть приложении на PyQt5, которое, предположим, может упасть после некоторой ошибки.
Как мне в коде из примера ниже добиться такого результата, чтобы после падения главного окна оно закрывалось и вызывалось небольшое диалоговое окно с текстом об ошибке и кнопкой "Ок", после закрытия которого приложение app завершало работу?
import sys
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QMainWindow, QApplication, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget)
self.layout_main_window = QVBoxLayout()
self.central_widget.setLayout(self.layout_main_window)
self.btn_crash_programm = QPushButton('Crash')
self.btn_crash_programm.clicked.connect(self.crash)
self.layout_main_window.addWidget(self.btn_crash_programm)
def crash(self):
x = 2 / 0
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle('Fusion')
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
Я планировал добиться этого, оборачивая эту часть кода в try - except, но это не работает, блок except не выполняется, главное окно закрывается, а приложение продолжает работать и грузить систему.
main_window = MainWindow()
main_window.show()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант:
import sys
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QMainWindow, \
QApplication, QPushButton, QMessageBox
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget)
self.layout_main_window = QVBoxLayout()
self.central_widget.setLayout(self.layout_main_window)
self.btn_crash_programm = QPushButton('Crash')
self.btn_crash_programm.clicked.connect(self.crash)
self.layout_main_window.addWidget(self.btn_crash_programm)
def crash(self):
x = 2 / 0
if __name__ == '__main__':
import traceback # +++
app = QApplication(sys.argv)
app.setStyle('Fusion')
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def excepthook(exc_type, exc_value, exc_tb):
tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
msg = QMessageBox.critical(
None,
"Error catched!:",
tb
)
QApplication.quit()
sys.excepthook = excepthook
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
