No se puede cerrar la aplicación GUI

from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(277, 244) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) self.menubar.setObjectName("menubar") self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile.setObjectName("menuFile") MainWindow.setMenuBar(self.menubar) self.actionQuit = QtWidgets.QAction(MainWindow) self.actionQuit.setObjectName("actionQuit") self.actionQuit.setShortcut("Ctrl+Q") self.actionQuit.setStatusTip("Quit the application") self.actionQuit.triggered.connect(MainWindow.closeEvent) self.menuFile.addAction(self.actionQuit) self.menubar.addAction(self.menuFile.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.show() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.actionQuit.setText(_translate("MainWindow", "Quit")) class MyWindow(QtWidgets.QMainWindow): def closeEvent(self, event): print(event) result = QtWidgets.QMessageBox.question(self, "Confirm Exit...", "Are you sure you want to exit ?", QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No) event.ignore() print(result) if result == QtWidgets.QMessageBox.Yes: event.accept() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = MyWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) sys.exit(app.exec_()) 

Cuando bash cerrar la aplicación usando el atajo de teclado Ctrl + Q, MessageBox aparece para la pregunta y cuando hago clic en cualquiera de las opciones que obtengo

 AttributeError: 'bool' object has no attribute 'ignore' 

¿Dónde me he equivocado?

No debe llamar directamente al método closeEvent() (o los métodos que xxxEvent ), ya que los elementos internos de Qt lo llaman a través del ciclo de eventos, en su lugar, debe usar el método close() para invocar indirectamente a closeEvent() :

 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(277, 244) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) self.menubar.setObjectName("menubar") self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile.setObjectName("menuFile") MainWindow.setMenuBar(self.menubar) self.actionQuit = QtWidgets.QAction(MainWindow) self.actionQuit.setObjectName("actionQuit") self.actionQuit.setShortcut("Ctrl+Q") self.actionQuit.setStatusTip("Quit the application") self.menuFile.addAction(self.actionQuit) self.menubar.addAction(self.menuFile.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.actionQuit.setText(_translate("MainWindow", "Quit")) class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(MyWindow, self).__init__(parent) self.setupUi(self) self.actionQuit.triggered.connect(self.close) def closeEvent(self, event): print(event) result = QtWidgets.QMessageBox.question(self, "Confirm Exit...", "Are you sure you want to exit ?", QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No) event.ignore() print(result) if result == QtWidgets.QMessageBox.Yes: event.accept() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = MyWindow() w.show() sys.exit(app.exec_()) 

Al conectar la acción a la función así, self.actionQuit.triggered.connect(MainWindow.closeEvent)

se asegura de que la señal triggered se pase a la función, pero esta señal es un booleano como está escrito en la documentación , lo que significa que un event es un booleano en su código a continuación:

 def closeEvent(self, event): print(event) result = QtWidgets.QMessageBox.question(self, "Confirm Exit...", "Are you sure you want to exit ?", QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No) event.ignore() print(result) if result == QtWidgets.QMessageBox.Yes: event.accept() 

Un booleano no tiene un atributo de ignore o accept , por lo tanto, AttributeError. No tengo una solución, pero esa es la fuente de su problema. Esperemos que salir del progtwig con un atajo de teclado sea una pregunta que ya fue respondida.