Search code examples
pythondialogpyqtpyqt4

How to get result from corfirmation dialog


I have problem with the results of my pop-up window. Below I have shown part of my code to understand the problem.

It's a kind of pop-up window where the user makes some choice in the GUI. After this it should show a window where there will be the question "Are you sure?", and two buttons "Yes" and "No".

The problem is that when I test the code below (before and after the msg.show()), I have the same value set as False.

Why doesnt it work like this:

  • Before function -> False
  • Show my window and wait to click the button
  • If I clicked button "Yes", then give True, else False

How I can handle this properly? Is there another approach?

from PyQt4 import QtCore, QtGui
from Message import Ui_Message
import sys

class MessageBox(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent=None)
        self.msg = Ui_Message()
        self.msg.setupUi(self)
        self.confirmed=False
        self.declined=False

        QtCore.QObject.connect(self.msg.NoButton, QtCore.SIGNAL(("clicked()")), self.Declined)
        QtCore.QObject.connect(self.msg.YesButton, QtCore.SIGNAL(("clicked()")), self.Confirmed)

    def Confirmed(self):
        self.confirmed = True
        MessageBox.close(self)
        return True

    def Declined(self):
        self.declined = True
        MessageBox.close(self)



if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    msg = MessageBox()
    print('Befor show window',msg.confirmed)
    msg.show()
    print('After show window', msg.confirmed)
    sys.exit(app.exec_())

Solution

  • Your example doesn't work, because you are printing "After show window" before the window has closed. It is the exec() method that blocks, not the show() method, so your example would need to be written like this:

    app = QtGui.QApplication(sys.argv)
    msg = MessageBox()
    print('Before show window', msg.confirmed)
    msg.show()
    app.exec_() # this blocks, waiting for close
    print('After show window', msg.confirmed)
    sys.exit()
    

    However, a much more realistic example showing how to use a dialog to confirm an action would be something like this:

    import sys
    from PyQt4 import QtCore, QtGui
    
    class MessageBox(QtGui.QDialog):
        def __init__(self, parent=None):
            super(MessageBox, self).__init__(parent)
            self.yesButton = QtGui.QPushButton('Yes')
            self.noButton = QtGui.QPushButton('No')
            layout = QtGui.QGridLayout(self)
            layout.addWidget(QtGui.QLabel('Are you sure?'), 0, 0)
            layout.addWidget(self.yesButton, 1, 0)
            layout.addWidget(self.noButton, 1, 1)
            self.yesButton.clicked.connect(self.accept)
            self.noButton.clicked.connect(self.reject)
    
    class Window(QtGui.QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.button = QtGui.QPushButton('Do Something')
            self.button.clicked.connect(self.handleButton)
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.button)
    
        def handleButton(self):
            if self.confirmSomething():
                print('Yes')
            else:
                print('No')
    
        def confirmSomething(self):
            msg = MessageBox(self)
            result = msg.exec_() == QtGui.QDialog.Accepted
            msg.deleteLater()
            return result
    
    if __name__ == "__main__":
    
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.show()
        app.exec_()