본문으로 바로가기

파이썬(Python) PyQt5 QRadioButton 선택 사용하기

category 파이썬/PyQt5 2021. 11. 17. 19:17
반응형

QRadioButton 여러 개의 선택지 중에 하나를 골라야 하는 경우 사용하는 위젯입니다. QCheckBox 는 다중 선택이 가능하지만 QRadioButton 는 하나만 선택할 수 있습니다. 이것을 흔히 라디오박스라고 합니다. 오늘은 4개의 라디오박스 중 하나를 선택하면 QLabel 에 표시하는 기능을 구현할 것입니다.

 

화면에 QRadioButton 선택 여부를 확인할 수 있는 QLabel 객체를 추가합니다. QLabel 에는 어느 QRadioButton 이 체크되었는지 표시합니다.

from PyQt5.QtWidgets import QLabel

# QLabel 에서 선택한 값 표시
self.label = QLabel(self)
self.label.setGeometry(10, 10, 150, 30)
self.label.setStyleSheet('background-color : #FFFFFF')

 

다음은 4개의 QRadioButton 객체를 생성합니다. QRadioButton 에는 clicked 시그널에 동작할 함수를 연결하는데, 모두 동일한 self.radio_select() 입니다. 해당 함수에서는 각 QRadioButton 의 체크여부를 확인해서  QLabel 에 어느  QRadioButton 이 선택되었는지 표시합니다.

from PyQt5.QtWidgets import QRadioButton

# QRadioButton1 위젯 생성
self.radio1 = QRadioButton('Radio1 Button', self)
self.radio1.clicked.connect(self.radio_select)
self.radio1.setGeometry(10, 50, 150, 30)

# QRadioButton2
self.radio2 = QRadioButton('Radio2 Button', self)
self.radio2.clicked.connect(self.radio_select)
self.radio2.setGeometry(10, 90, 150, 30)

# QRadioButton3
self.radio3 = QRadioButton('Radio3 Button', self)
self.radio3.clicked.connect(self.radio_select)
self.radio3.setGeometry(10, 130, 150, 30)

# QRadioButton4
self.radio4 = QRadioButton('Radio4 Button', self)
self.radio4.clicked.connect(self.radio_select)
self.radio4.setGeometry(10, 170, 150, 30)

 

QRadioButton clicked 시그널에 연결된 self.radio_select() 함수의 내용입니다. QRadioButton isChecked() 함수를 사용해서 체크 여부를 확인합니다. 그리고 if ~ elif ~ 조건문을 사용해서 어느 QRadioButton 이 선택되었는지 확인한 후 QLabel 에 표시합니다. QMainWindows 에 추가한 4개의 QRadioButton 는 서로 연결되어 있기 때문에 하나가 선택되면 이전에 선택된 QRadioButton는 자동 해제가 됩니다.

# QRadioButton 선택 이벤트
@pyqtSlot()
def radio_select(self):
    # QRadioButton1 클릭 여부 표시
    if self.radio1.isChecked():
        self.label.setText('Radio1 Check')
    elif self.radio2.isChecked():
        self.label.setText('Radio2 Check')
    elif self.radio3.isChecked():
        self.label.setText('Radio3 Check')
    elif self.radio4.isChecked():
        self.label.setText('Radio4 Check')

 

위에서 설명한 내용을 구현한 전체 소스입니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QRadioButton, QLabel, QBoxLayout, \
    QPushButton, QMainWindow, QApplication, QGroupBox

from PyQt5.QtCore import pyqtSlot

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 500, 300)  # x, y, w, h
        self.setWindowTitle('Status Window')

        # QLabel 에서 선택한 값 표시
        self.label = QLabel(self)
        self.label.setGeometry(10, 10, 150, 30)
        self.label.setStyleSheet('background-color : #FFFFFF')

        # QRadioButton1 위젯 생성
        self.radio1 = QRadioButton('Radio1 Button', self)
        self.radio1.clicked.connect(self.radio_select)
        self.radio1.setGeometry(10, 50, 150, 30)

        # QRadioButton2
        self.radio2 = QRadioButton('Radio2 Button', self)
        self.radio2.clicked.connect(self.radio_select)
        self.radio2.setGeometry(10, 90, 150, 30)

        # QRadioButton3
        self.radio3 = QRadioButton('Radio3 Button', self)
        self.radio3.clicked.connect(self.radio_select)
        self.radio3.setGeometry(10, 130, 150, 30)

        # QRadioButton4
        self.radio4 = QRadioButton('Radio4 Button', self)
        self.radio4.clicked.connect(self.radio_select)
        self.radio4.setGeometry(10, 170, 150, 30) 

    # QRadioButton 선택 이벤트
    @pyqtSlot()
    def radio_select(self):
        # QRadioButton1 클릭 여부 표시
        if self.radio1.isChecked():
            self.label.setText('Radio1 Check')
        elif self.radio2.isChecked():
            self.label.setText('Radio2 Check')
        elif self.radio3.isChecked():
            self.label.setText('Radio3 Check')
        elif self.radio4.isChecked():
            self.label.setText('Radio4 Check')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

 

다음은 소스를 수정해서 2개의 그룹으로 나누겠습니다. 4개를 2개씩 두 개의 그룹으로 나눠서 선택 여부를 확인하고 싶다면 어떻게 해야 할까요? 쉽게 말해서 하나의 그룹에서 선택하면 다른 그룹의 QRadioButton 에는 영향을 미치지 않게 하는 것입니다. 그러기 위해서는 QGroupBox 를 사용해서 QRadioButton 위젯을 묶어야 합니다. 그런데 QGroupBox 에는 위젯을 바로 추가할 수 없습니다. Layout 객체를 만들어서 QRadioButton 를 추가한 후 QGroupBox 객체에 Layout 을 추가해야 합니다. Layout 클래스는 다양합니다. QBoxLayout, QVBoxLayout, QHBoxLayout, QGridLayout 등이 있는데, 이중에 하나를 골라서 객체를 생성하고 QRadioButton 위젯을 추가합니다.

 

1. QRadioButton 객체 생성

2. QBoxLayout Layout 객체 생성

3. QBoxLayout QRadioButton 추가

4. QGroupBox 객체 생성

5. QGroupBox QBoxLayout 추가

 

2 ~ 3번 단계를 구현하기 위해 QBoxLayout Layout 을 생성하고 QRadioButton 2 개를 추가합니다.

from PyQt5.QtWidgets import QBoxLayout

self.boxlayout1 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
self.boxlayout1.addWidget(self.radio1)
self.boxlayout1.addWidget(self.radio2)

 

4 ~ 5번 단계에서는 QGroupBox 객체에 2번 단계에서 만든 QBoxLayout 을 추가하고 setGeometry() 함수를 이용해서 화면 내에서의 위치를 지정합니다.

from PyQt5.QtWidgets import QGroupBox

# QGroupBox1 생성
self.groupbox1 = QGroupBox('Group Box 1', self)
self.groupbox1.setLayout(self.boxlayout1)
self.groupbox1.setGeometry(10, 60, 300, 60)

 

이제 1 ~ 5번 단계를 한번 더 반복해서 두 번째 Layout QGroupBox 생성하고 화면에 추가합니다.

# ----- QBoxLayout2 객체 생성 -----
self.boxlayout2 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
self.boxlayout2.addWidget(self.radio3)
self.boxlayout2.addWidget(self.radio4)

# QGroupBox2 생성
self.groupbox2 = QGroupBox('Group Box 1', self)
self.groupbox2.setLayout(self.boxlayout2)
self.groupbox2.setGeometry(10, 130, 300, 60)

 

QRadioButton 의 선택을 구분하기 위해 두 그룹으로 나누는 작업을 완료했습니다. 그럼 그룹별로 선택에 영향을 주지 않는지 테스트해 보겠습니다. 그림처럼 이전과 달리 그룹에 하나씩 선택이 된 것을 볼 수 있습니다.

 

최종 소스는 다음과 같습니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QRadioButton, QLabel, QBoxLayout, \
    QMainWindow, QApplication, QGroupBox

from PyQt5.QtCore import pyqtSlot

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 500, 300)  # x, y, w, h
        self.setWindowTitle('Status Window')

        # QLabel 에서 선택한 값 표시
        self.label = QLabel(self)
        self.label.setGeometry(10, 10, 150, 30)
        self.label.setStyleSheet('background-color : #FFFFFF')

        # QRadioButton1 위젯 생성
        self.radio1 = QRadioButton('Radio1 Button')
        self.radio1.clicked.connect(self.radio_select)

        # QRadioButton2
        self.radio2 = QRadioButton('Radio2 Button')
        self.radio2.clicked.connect(self.radio_select)

        # QRadioButton3
        self.radio3 = QRadioButton('Radio3 Button', self)
        self.radio3.clicked.connect(self.radio_select)

        # QRadioButton4
        self.radio4 = QRadioButton('Radio4 Button', self)
        self.radio4.clicked.connect(self.radio_select)

        # ----- QBoxLayout1 객체 생성 -----
        self.boxlayout1 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
        self.boxlayout1.addWidget(self.radio1)
        self.boxlayout1.addWidget(self.radio2)

        # QGroupBox1 생성
        self.groupbox1 = QGroupBox('Group Box 1', self)
        self.groupbox1.setLayout(self.boxlayout1)
        self.groupbox1.setGeometry(10, 60, 300, 60)

        # ----- QBoxLayout2 객체 생성 -----
        self.boxlayout2 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
        self.boxlayout2.addWidget(self.radio3)
        self.boxlayout2.addWidget(self.radio4)

        # QGroupBox2 생성
        self.groupbox2 = QGroupBox('Group Box 1', self)
        self.groupbox2.setLayout(self.boxlayout2)
        self.groupbox2.setGeometry(10, 130, 300, 60)

    # QRadioButton 선택 이벤트
    @pyqtSlot()
    def radio_select(self):
        # QRadioButton1 클릭 여부 표시
        if self.radio1.isChecked():
            self.label.setText('Radio1 Check')
        elif self.radio2.isChecked():
            self.label.setText('Radio2 Check')
        elif self.radio3.isChecked():
            self.label.setText('Radio3 Check')
        elif self.radio4.isChecked():
            self.label.setText('Radio4 Check')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())
반응형