본문 바로가기
프로그래밍 관련/PyQt

PyQt 라디오버튼 radio button(1) 라디오버튼 기초 개념

by 존버매니아.임베디드 개발자 2022. 8. 14.
반응형

PyQt  라디오버튼 radio button(1) - 기본개념

 

유저에게 어떤 메뉴를 선택하게 만드는데, 여러개의 보기중에 1개만 고를 수 있도록하는 기능

그때 사용하는게 라디오 버튼인데 말로 설명하니까 이해 안 될 수 있는데

예를 들어 시험 문제의 정답 고를때 4개의 보기중에 1개만 선택해야되는 그런 버튼 기능을 하는게 라디오버튼이다.

 

04) QRadioButton - PyQt5 Tutorial - 파이썬으로 만드는 나만의 GUI 프로그램 (wikidocs.net)

위 사이트 출처 . 감사합니다.

 

관련 메소드

setChecked() . 해당 버튼을 선택상태로 만듬

isChecked(). 해당 버튼이 현재 선택 된 상태인지 알려줌

 

관련 시그널

clicked() -> 해당 라디오버튼 클릭 됐을 때

toggled() -> 해당 라디오버튼의 상태가 바꼈을 때


예시1

import sys
from PyQt5.QtWidgets import *
   
    
class MyWindow(QMainWindow):
         
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        self.setGeometry(1000, 200, 700, 700)


        #라디오버튼 2개, 이것들은 Groupbox1에 올라가고 자기들끼리 exclusive
        self.radio1 = QRadioButton("radio1",self)
        self.radio1.move(20,0)
        self.radio1.clicked.connect(self.radio1_fun)

        self.radio2 = QRadioButton("radio2",self)
        self.radio2.move(20,100)
        self.radio2.clicked.connect(self.radio2_fun)
    
        self.radio3 = QRadioButton("radio3",self)
        self.radio3.move(20,200)
        self.radio3.clicked.connect(self.radio3_fun)
    
    def radio1_fun(self):
        print("button 1 clicked")
    
    def radio2_fun(self):
       print("button 2 clicked")

    def radio3_fun(self):
       print("button 3 clicked")



if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()

    app.exec_()

 

라디오 버튼3개를 사용하고, 3개가 모두 exclusive로 동작함

각각의 라디오 버튼이 클릭되면 각각 연결된 funnction 실행


버튼이 새롭게 클릭 됐을 때만 무언가 동작하고 싶은 경우?

무슨 말이냐면 버튼1이 선택된 상태에서 버튼1을 또 눌렀을 경우에는 아무 동작도 하지않고

원래 선택이 안된 상태였는데 새롭게 선택됐을 때만 무언가를 하게하려면 어떻게 해야 할까?

이 때는 clicked 가 아니라 toggled를 활용하면되는데,

유의할 점은 toggled는 선택이 됐을 때도 실행되지만 , 선택이 풀렸을 때도 실행이 된다는 점이다.

toggled 시그널은 실행될 때 파라미터를 한가지 넘기는데, True 이면 toggled 발생했는데 그 토글이벤트가 새롭게 선택된 이벤트라는 의미이고, false이면 그 토글이벤트가 선택이 해제된 이벤트라는 의미이다.

 

아래와 같이 코드를 구성하자. 새롭게 set 됐을때만 함수가 실행되는건 아니고 set이 되거나, 해제될 때 함수가 실행되는데 함수가 실행된 후에,

if문을 통해서 현재 발생된 토글이벤트가 새롭게 set된것인지, set이 해제된 것인지를 구분해서 동작하도록 코드 구성

 

 

 

import sys
from PyQt5.QtWidgets import *
   
    
class MyWindow(QMainWindow):
         
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        self.setGeometry(1000, 200, 700, 700)


        #라디오버튼 2개, 이것들은 Groupbox1에 올라가고 자기들끼리 exclusive
        self.radio1 = QRadioButton("radio1",self)
        self.radio1.move(20,0)
        self.radio1.toggled.connect(self.radio1_fun)

        self.radio2 = QRadioButton("radio2",self)
        self.radio2.move(20,100)
        self.radio2.toggled.connect(self.radio2_fun)
    
        self.radio3 = QRadioButton("radio3",self)
        self.radio3.move(20,200)
        self.radio3.toggled.connect(self.radio3_fun)
    
    def radio1_fun(self, checked):
        if checked:
            print("button 1 clicked")       
   
    def radio2_fun(self,checked):
        if checked:
            print("button 2 clicked")

    def radio3_fun(self,checked):
        if checked:
            print("button 3 clicked")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()

    app.exec_()

라디오버튼 클릭했을 때 실행되는 function을 버튼 마다 각각 하지않고, 하나의 function을 실행시키고 해당 function안에서 어떤 버튼이 선택된 건지 구분해서 동작 시키기

import sys
from PyQt5.QtWidgets import *
   
    
class MyWindow(QMainWindow):
         
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        self.setGeometry(1000, 200, 700, 700)


        #라디오버튼 2개, 이것들은 Groupbox1에 올라가고 자기들끼리 exclusive
        self.radio1 = QRadioButton("radio1",self)
        self.radio1.move(20,0)
        self.radio1.toggled.connect(self.radio_fun)

        self.radio2 = QRadioButton("radio2",self)
        self.radio2.move(20,100)
        self.radio2.toggled.connect(self.radio_fun)
    
        self.radio3 = QRadioButton("radio3",self)
        self.radio3.move(20,200)
        self.radio3.toggled.connect(self.radio_fun)
    
    def radio_fun(self, checked):
        btnNum = 0
        if checked:
            if self.radio1.isChecked():
                btnNum=1
            elif self.radio2.isChecked():
                btnNum=2
            elif self.radio3.isChecked():
                btnNum=3
            
            print("Selected Button : %d " %btnNum)    
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()

    app.exec_()

 

반응형