Paul
Paul

Reputation: 358

How to return values from a QDialog instance in Python?

I'm trying to open a QtGui.QDialog, request a set of values from the user, then return the values after "save" is clicked.

The following code should run without modification.

import sys
from PySide import QtCore, QtGui
import numpy as np

class MyQDialog(QtGui.QDialog):

    def __init__(self, parent=None):
        super(MyQDialog, self).__init__(parent)

        ## Default values

        self.eta1 = 1.0
        self.eta2 = 1.0

        ## Create labels and buttons

        frameStyle = QtGui.QFrame.Sunken | QtGui.QFrame.Panel

        self.eta1__QL = QtGui.QLabel(str(self.eta1))
        self.eta1__QL.setFrameStyle(frameStyle)
        self.eta1__QBtn = QtGui.QPushButton("Set eta1:")

        self.eta2__QL = QtGui.QLabel(str(self.eta2))
        self.eta2__QL.setFrameStyle(frameStyle)
        self.eta2__QBtn = QtGui.QPushButton("Set eta2:")

        self.cancel__QBtn = QtGui.QPushButton("Cancel")
        self.save__QBtn = QtGui.QPushButton("Save")

        self.eta1__QBtn.clicked.connect(self.set_eta1)
        self.eta2__QBtn.clicked.connect(self.set_eta2)
        self.cancel__QBtn.clicked.connect(self.cancel)
        self.save__QBtn.clicked.connect(self.save)

        ## Set layout, add buttons

        layout = QtGui.QGridLayout()
        layout.setColumnStretch(1, 1)
        layout.setColumnMinimumWidth(1, 250)

        layout.addWidget(self.eta1__QBtn, 1, 0)
        layout.addWidget(self.eta1__QL, 1, 1)
        layout.addWidget(self.eta2__QBtn, 2, 0)
        layout.addWidget(self.eta2__QL, 2, 1)
        layout.addWidget(self.cancel__QBtn, 3, 0)
        layout.addWidget(self.save__QBtn, 3, 1)

        self.setLayout(layout)

        self.setWindowTitle("Thank you for reading!")

    ## Button functions

    def set_eta1(self):
        self.eta1, ok = QtGui.QInputDialog.getDouble(self,
                "Change of variable", "Rate (type 1):", 0.1, 0, 1e8, 3)
        if ok:
            self.eta1__QL.setText(str(self.eta1))

    def set_eta2(self):
        self.eta2, ok = QtGui.QInputDialog.getDouble(self,
                "Change of variable", "Rate (type 2):", 0.3, 0, 1e8, 3)
        if ok:
            self.eta2__QL.setText(str(self.eta2))

    def cancel(self):
        self.close()

    def save(self):
        return self.eta2, self.eta2


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    edit_params__QD = MyQDialog()

    if edit_params__QD.exec_():
        value1, value2 = edit_params__QD.save()

        print 'Success!', value1, value2
    else:
        print 'I shouldn\'t print, but I do.'

    sys.exit()

Thank you very much for your time! Any suggestions for improvement are greatly appreciated!

Upvotes: 0

Views: 5443

Answers (1)

alothman
alothman

Reputation: 64

Change the return values in this line:

def save(self): 
    return self.eta2, self.eta2

to: return self.eta1, self.eta2

In main (of course your need to import sys):

app = QtGui.QApplication(sys.argv)
edit_params__QD = MyQDialog()
edit_params__QD.exec_()
if edit_params__QD.result() == 0:
    value1, value2 = edit_params__QD.save()
    print('Success!', value1, value2)

Add the second connection to what you already have:

self.save__QBtn.clicked.connect(self.save) 
self.save__QBtn.clicked.connect(self.close)

I hope this helps.

Upvotes: 1

Related Questions