ZetCode

PyQt QRadioButton

last modified July 9, 2020

PyQt QRadioButton tutorial shows how to work with QRadioButton widget.

Sources are available at PyQt-Examples repository. Visit Advanced PyQt5 e-book, read PyQt5 tutorial, or list all PyQt tutorials.

QRadioButton

QRadioButton is a button that is turned on or off. Radio buttons present multiple choices. In a group of radio buttons, only one radio button at a time can be checked; if the user selects another button, the previously selected button is turned off.

Radio buttons are auto-exclusive by default. If we want to have multiple separated groups of radio buttons, we put them into QButtonGroup.

Whenever a button is turned on or off, it emits the toggled signal.

Note: If a radio button is already selected and we select another radio button, two toggled signals are emitted.

PyQt QRadioButton example

The following is a simple example that uses QRadioButtons.

radio_button.py
#!/usr/bin/python


from PyQt5.QtWidgets import (QWidget, QRadioButton, QHBoxLayout, QVBoxLayout,
                             QLabel, QApplication)
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        vbox = QVBoxLayout()
        hbox = QHBoxLayout()

        rb1 = QRadioButton("Large", self)
        rb1.toggled.connect(self.updateLabel)

        rb2 = QRadioButton("Middle", self)
        rb2.toggled.connect(self.updateLabel)

        rb3 = QRadioButton("Small", self)
        rb3.toggled.connect(self.updateLabel)

        self.label = QLabel('', self)

        hbox.addWidget(rb1)
        hbox.addWidget(rb2)
        hbox.addWidget(rb3)
        
        vbox.addSpacing(15)

        vbox.addLayout(hbox)
        vbox.addWidget(self.label)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QRadioButton')
        self.show()

    def updateLabel(self, value):

        rbtn = self.sender()

        if rbtn.isChecked() == True:
            self.label.setText(rbtn.text())


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

We have three radio buttons. Only one button can be selected at a time. The text of the selected radio button is displayed in the adjacent label.

rb1 = QRadioButton("Large", self)

A QRadioButton is created. The first parameter is its text label.

rb1.toggled.connect(self.updateLabel)

When we click on the radio button, the toggled signal is emitted.

def updateLabel(self, value):

    rbtn = self.sender()

    if rbtn.isChecked() == True:
        self.label.setText(rbtn.text())

In the updateLabel handler, we determine the widget that invoked it with sender. The isChecked function checks if the radio button is turned on. If it is, we update the label with its text.

QRadioButton
Figure: QRadioButton

QRadioButton in QButtonGroup

The QButtonGroup class provides a container to organize groups of button widgets.

radio_button2.py
#!/usr/bin/python


from PyQt5.QtWidgets import (QWidget, QRadioButton, QHBoxLayout, QVBoxLayout,
                             QButtonGroup, QLabel, QApplication)
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        vbox = QVBoxLayout()
        hbox1 = QHBoxLayout()

        bg1 = QButtonGroup(self)

        rb1 = QRadioButton("Large", self)
        rb1.toggled.connect(self.updateLabel1)

        rb2 = QRadioButton("Middle", self)
        rb2.toggled.connect(self.updateLabel1)

        rb3 = QRadioButton("Small", self)
        rb3.toggled.connect(self.updateLabel1)


        hbox2 = QHBoxLayout()
        bg2 = QButtonGroup(self)

        rb4 = QRadioButton("Red", self)
        rb4.toggled.connect(self.updateLabel2)

        rb5 = QRadioButton("Green", self)
        rb5.toggled.connect(self.updateLabel2)

        rb6 = QRadioButton("Blue", self)
        rb6.toggled.connect(self.updateLabel2)

        self.label1 = QLabel('', self)
        self.label2 = QLabel('', self)

        bg1.addButton(rb1)
        bg1.addButton(rb2)
        bg1.addButton(rb3)

        bg2.addButton(rb4)
        bg2.addButton(rb5)
        bg2.addButton(rb6)

        hbox1.addWidget(rb1)
        hbox1.addWidget(rb2)
        hbox1.addWidget(rb3)

        hbox2.addWidget(rb4)
        hbox2.addWidget(rb5)
        hbox2.addWidget(rb6)

        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addWidget(self.label1)
        vbox.addWidget(self.label2)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QRadioButton')
        self.show()

    def updateLabel1(self, value):

        rbtn = self.sender()

        if rbtn.isChecked() == True:
            self.label1.setText(rbtn.text())

    def updateLabel2(self, value):

        rbtn = self.sender()

        if rbtn.isChecked() == True:
            self.label2.setText(rbtn.text())


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

In the example, we have two groups of radio buttons. To separate them, we place them into two QButtonGroups.

bg1 = QButtonGroup(self)

A QButtonGroup is created. It is a container widget used to manage buttons. It does not provide any visual representation.

bg1.addButton(rb1)
bg1.addButton(rb2)
bg1.addButton(rb3)

bg2.addButton(rb4)
bg2.addButton(rb5)
bg2.addButton(rb6)

The buttons are put into the button group with addButton function.

QRadioButtons in QButtonGroups
Figure: QRadioButtons in QButtonGroups

In this tutorial, we have worked with PyQt QRadioButton.

List all PyQt tutorials.