파이썬/PyQt5

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

녹두장군 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_())
반응형