使用PyQT5.QWidgets.QMessageBox时,应用程序崩溃(Python3.6.4,Windows10)

时间:2018-05-16 07:07:34

标签: python-3.x windows-10 pyqt5

因此,我一直在尝试使用PyQT5来为我一直在努力的应用程序提供GUI。

我遇到了QMessageBox功能的问题。

我一直试图创造一个"退出"应用程序的MenuBar上的操作。 最初我只是在点击时退出它并且有效。

现在我想让它给出一个弹出的消息"你确定吗?",这正是QMessageBox的作用。所以现在这是我的代码:

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.ui = uic.loadUi('rent_creation.ui', self)
        self.home()

    def home(self):
        self.ui.actionExit.triggered.connect(self.close_application)
        self.show()


    def close_application(self):
        choice = QMessageBox.question(self, 'Quit?',
                                      "Are you sure you want to quit?",
                                      QMessageBox.Yes | QMessageBox.No)
        if choice == QMessageBox.Yes:
            sys.exit()
        else:
            pass

现在,每当我运行此代码时单击“退出”按钮,Python就会崩溃。 我不确定我做错了什么......我一直在互联网上寻找它看起来都很好......我已经尝试过传递QmessageBox的所有变化(例如我尝试添加QWidgets.QMessageBox.Yes / No并且它没有修复此问题。)

我一直在关注互联网上的教程,其中这段代码几乎与他的相同,并且它在教程中以某种方式适用于他。

1 个答案:

答案 0 :(得分:1)

告诫:我在linux上,所以事情可能有点不同。

但是,如果问题与您使用sys.exit退出GUI这一事实有关,我不会感到惊讶。您可能应该干净地关闭窗口QApplication,然后退出程序。

以下示例可能会解决您的问题。由于我没有ui文件,我只是添加了一个菜单操作来关闭窗口并将其与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()