baha joher
baha joher

Reputation: 84

PyQt working with wizard and radio button

I made this wizard containing a radio button. When it is clicked, the finish button should return a list of radio buttons that were checked as text!

The input (it's virtual input for readability)

data=[['a','b','c'],['e','f'],['g','f']]
data1 = ['one','two','three']

this is my code

from PyQt4 import QtGui, QtCore

   def page3arg(x, n):
   page = QtGui.QWizardPage()
   page.setTitle("{}".format(x))
   page.setSubTitle("Please choose one of these state.")

   rd1 = QtGui.QRadioButton(page)
   rd2 = QtGui.QRadioButton(page)
   rd3 = QtGui.QRadioButton(page)

   layout = QtGui.QGridLayout()
   layout.addWidget(rd1, 2, 0)
   layout.addWidget(rd2, 2, 1)
   layout.addWidget(rd3, 2, 2)
   rd1.setText(' {}'.format(n[0]))
   rd2.setText(' {}'.format(n[1]))
   rd3.setText(' {}'.format(n[2]))
   page.setLayout(layout)

   return page


def page2arg(x, n):
    page = QtGui.QWizardPage()
    page.setTitle("{}".format(x))
    page.setSubTitle("Please choose one of these state.")

    rd1 = QtGui.QRadioButton(page)
    rd2 = QtGui.QRadioButton(page)

    layout = QtGui.QGridLayout()
    layout.addWidget(rd1, 2, 0)
    layout.addWidget(rd2, 2, 1)
    rd1.setText(' {}'.format(n[0]))
    rd2.setText(' {} .'.format(n[1]))

    page.setLayout(layout)
    return page

if __name__ == '__main__':

    import sys

    app = QtGui.QApplication(sys.argv)
    wizard = QtGui.QWizard()
    wizard.setStyleSheet(("font:50 10pt \"MS Shell Dlg 2\";"))

    for m in range(len(data1) - 1):
        x = data1[m]
        n= data[m]
        if len(n) == 3:
            page3 = page3arg(x, n)
            wizard.addPage(page3)
        elif len(n) == 2:
            page2 = page2arg(x, n)
            wizard.addPage(page2)
    wizard.show()
    sys.exit(wizard.exec_())

How do I write a function that will get the selections of the radio buttons in the end as list.

The list of radio button selections should look like this:

output = ['a','e','g'] 

Upvotes: 2

Views: 484

Answers (2)

eyllanesc
eyllanesc

Reputation: 243965

If you want to get radiobutton checked, then a simple solution is to associate it with a QButtonGroup for each page and use the checkedButton() function to get the option checked. And to know when you press the finish button you must use the button() function of QWizard and connect it to a slot.

Also it is not necessary to have 2 functions that do the same as page3arg and page2arg, I have reduced it in a generalized function for n arguments

from PyQt4 import QtCore, QtGui


class Wizard(QtGui.QWizard):
    def __init__(self, parent=None):
        super(Wizard, self).__init__(parent)
        datas = [["a", "b", "c"], ["e", "f"], ["g", "f"]]
        titles = ["one", "two", "three"]
        self.setStyleSheet(('font:50 10pt "MS Shell Dlg 2";'))

        self.groups = []
        for title, options in zip(titles, datas):
            page, group = Wizard.create_page(title, options)
            self.addPage(page)
            self.groups.append(group)

        self.button(QtGui.QWizard.FinishButton).clicked.connect(
            self.on_finished
        )
        self._results = []

    @property
    def results(self):
        self.get_options()
        return self._results

    def get_options(self):
        self._results = []
        for group in self.groups:
            button = group.checkedButton()
            if button is not None:
                self._results.append(button.text())

    @QtCore.pyqtSlot()
    def on_finished(self):
        print("finished", self.results)


    @staticmethod
    def create_page(title, options):
        page = QtGui.QWizardPage()
        group = QtGui.QButtonGroup(page)
        page.setTitle(title)
        page.setSubTitle("Please choose one of these state.")
        hlay = QtGui.QHBoxLayout(page)
        for option in options:
            radiobutton = QtGui.QRadioButton(text=option)
            group.addButton(radiobutton)
            hlay.addWidget(radiobutton)
        return page, group


if __name__ == "__main__":

    import sys

    app = QtWidgets.QApplication(sys.argv)
    wizard = Wizard()
    wizard.show()
    ret = app.exec_()
    print("outside clas", wizard.results)
    sys.exit(ret)

Upvotes: 1

Amir B
Amir B

Reputation: 41

Try to put all radio buttons in a list, and for each radio button in the list, get it's text and insert it to your output list. For example,

lst = []
lst.append(rd1)
lst.append(rd2)
lst.append(rd3)
output = []
for val in lst:
    output.append(val.text())

Upvotes: 0

Related Questions