Предостережение: я нахожусь на linux, поэтому, скорее всего, все немного по-другому.
Однако я не удивлюсь, если проблема связана с тем, что вы используете sys.exit
для выхода из графического интерфейса.Возможно, вам следует аккуратно закрыть окно QApplication
и затем выйти из программы.
Следующий пример может решить вашу проблему.Поскольку у меня нет вашего пользовательского файла, я просто добавил действие меню, чтобы закрыть окно и связать его со слотом QMainWindow.close
, а затем переопределить метод closeEvent
.См. Комментарии в коде:
import sys
from PyQt5 import QtWidgets
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.home()
def home(self):
# add a menu bar with a File menu and a Close action
menu_bar = QtWidgets.QMenuBar(self)
menu = QtWidgets.QMenu('File', menu_bar)
menu_bar.addMenu(menu)
action = menu.addAction('Close')
# connect the Close action with the QMainWindow.close slot
action.triggered.connect(self.close)
self.setMenuBar(menu_bar)
def closeEvent(self, event):
"""override the QMainWindow.closeEvent method to:
* fire up a QMessageBox with a question
* accept the close event if the user click yes
* ignore it otherwise.
Parameters
----------
event : QtCloseEvent
emitted when someone or something asks to close the window
"""
if self.ask_quit():
event.accept()
else:
event.ignore()
def ask_quit(self):
choice = QtWidgets.QMessageBox.question(self, 'Quit?',
"Are you sure you want to quit?",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
return choice == QtWidgets.QMessageBox.Yes
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Simple')
w.show()
sys.exit(app.exec_())
Описанный выше способ закрытия окна, т. Е. Использование closeEvent
и подключение действия меню к close
, имеет то преимущество, что окно подтверждения открывается каждый раз.время, когда кто-то просит закрыть окно, независимо от метода: вы получаете окно сообщения, также нажимая на кнопку X
окна или alt+F4
Редактировать: пример того, как правильно закрыть окноQApplication
только из меню Close
.Это должно более соответствовать исходному поведению приложения в вопросе (см. Комментарий).
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.home()
def home(self):
menu_bar = QtWidgets.QMenuBar(self)
menu = QtWidgets.QMenu('File', menu_bar)
menu_bar.addMenu(menu)
action = menu.addAction('Close')
# connect the Close menu to the ``ask_quit`` slot to ask and exit the
# application on "yes"
action.triggered.connect(self.ask_quit)
self.setMenuBar(menu_bar)
def closeEvent(self, event):
"""Ignore all ways of closing"""
event.ignore()
@QtCore.pyqtSlot()
def ask_quit(self):
choice = QtWidgets.QMessageBox.question(self, 'Quit?',
"Are you sure you want to quit?",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
if choice == QtWidgets.QMessageBox.Yes:
QtWidgets.QApplication.quit()