FrameWork/PyQT

파이썬 라이브러리 PyQT을 통해 여러 종류의 버튼을 생성하고 이벤트 연결하기

jheaon 2023. 7. 5. 01:18

 

이번에는 PyQT에서 제공하는 버튼 요소에 대한 기법에 대해서 알아보자. PyQT에서 제공하는 버튼의 종류는 여러 가지가 있는데 이번에는 이를 순서대로 정리해서 알아보고자 한다. 해당 순서는 아래와 같다. 

 

  • QT Designer에서 버튼을 생성하고 파이썬 코드로 변환하기
  • 푸시 버튼
  • 라디오 버튼과 체크 박스

 

 

QT Designer에서 버튼 생성하고, 파이썬 코드로 변환하기

QT Designer에서 만든 ui파일을 py파일로 만드는 방법은 아래 게시글에서 설명드렸기에 아래 글로 들어가면 해당 내용을 쉽게 확인할 수 있으니 참고 바란다. 

 

티스토리 : https://jheaon.tistory.com/27

 

파이썬으로 그래픽 인터페이스 제작하기! Pyside6 설치 및 Qt designer로 작업물 .py 파일로 변환하기

파이썬을 배우게 되면 창을 뛰우고 그 창에 명령어를 연결시켜 실행되는 프로그램 개발에 대해 관심 생길 수도 있다. 이러한 것에 도움을 주는 라이브러리가 있는데 이번에 소개드릴 "Pyside"라는

jheaon.tistory.com

 

 

 

 

 

 

 

푸시 버튼

푸시버튼은 일반적으로 버튼을 누를 때 이벤트를 발생시키는 버튼을 의미한다. QT Designer에서 Push button을 이용하여 생성할 수 있다. 일단 푸시 버튼에 이벤트를 연결하기 위해서 QT Designer에서 버튼 컴포넌트를 하나 끌어 생성한 뒤에 오른쪽 위에 작업 공간을 통해 버튼의 컴포넌트 이름을 btn_hi라고 지정하고 ui 파일을 py 파일로 변환한다.

 

 이를 ui 파일을 py파일로 만든 코드는 다음과 같다.

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QMainWindow, QPushButton, QSizePolicy, QWidget, QMessageBox)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.btn_hi = QPushButton(self.centralwidget)
        self.btn_hi.setObjectName(u"btn_hi")
        self.btn_hi.setGeometry(QRect(320, 260, 151, 41))
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.btn_hi.setText(QCoreApplication.translate("MainWindow", u"PushButton", None))


app = QApplication([])
window = QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(window)
window.show()
app.exec()

 

버튼과 이벤트 연결하기

버튼 컴포넌트는 clicked.connect() 함수를 이용하여 버튼에 클릭 이벤트가 발생했을 때, self.method의 함수가 호출되도록 설정할 수 있다. 예시 코드는 다음과 같다.

 

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.btn_hi = QPushButton(self.centralwidget)
        self.btn_hi.setObjectName(u"btn_hi")
        self.btn_hi.setGeometry(QRect(320, 260, 151, 41))
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)
        
        # 아래에 있는 click() 함수가 실행됨. 함수 인자로 넘겨 줄 때 ()
        # 을 사용하면 안된다는 것에 유념하자!
        self.btn_hi.clicked.connect(self.click)
        
    def click(self):
        print("하이요")

 

버튼 안의 텍스트 문구 바꾸기

만약 버튼 안에 있는 텍스트의 문구를 수정하고 싶다면 setText()을 이용하여 처리할 수 있다.

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.btn_hi = QPushButton(self.centralwidget)
        self.btn_hi.setObjectName(u"btn_hi")
        self.btn_hi.setGeometry(QRect(320, 260, 151, 41))
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)
        
        self.btn_hi.clicked.connect(self.click)
        
    def click(self):
        self.btn_hi.setText("반갑습니다.")

버튼 클릭 전, 클릭 

 

 

 

 

 

 

 

 

라디오 버튼과 체크 박스

라디오 버튼은 여러 선택지를 주고, 여러 선택지 중 하나만 선택하게 만들 때 주로 사용하는 버튼이다. 그에 반해 체크 박스는 여러 선택지를 중복으로 선택하여 결괏값을 받을 때 주로 사용하는 버튼이다. 하지만 이는 권고 사항일 뿐 구현하는 로직에 따라 기능을 다르게 구현할 수 있다. 

 

라디오 버튼 vs 체크 박스

 

일반적으로 여러 선택지 중 하나만 선택하게 만들기 위해서는 하나의 그룹으로 묶어서 처리하는 어떤 방식이 필요한데, 이를 if - else 문으로 처리할 수 있다.

 

아래 코드는 2개의 라디오 버튼을 생성하고 일반 버튼과 이벤트를 연결하여 여러 선택지를 제시하고, 그중 하나만 선택할 수 있도록 라디오 버튼 이벤트를 생성하는 코드이다. 

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        
        # 라디오 버튼 2개 생성
        self.radioButton = QRadioButton(self.centralwidget)
        self.radioButton.setObjectName(u"radioButton")
        self.radioButton.setGeometry(QRect(220, 220, 89, 20))
        self.radioButton_2 = QRadioButton(self.centralwidget)
        self.radioButton_2.setObjectName(u"radioButton_2")
        self.radioButton_2.setGeometry(QRect(340, 220, 89, 20))
        
        # 푸시 버튼 생성
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(350, 270, 75, 24))
        
        # 푸시 이벤트 설정
        self.pushButton.clicked.connect(self.click)
        

    def click(self):
        if self.radioButton.isChecked():
            self.radioButton_2.setChecked(True)
        elif self.radioButton_2.isChecked():
            self.radioButton.setChecked(True)
        else:
            self.radioButton.setChecked(True)

 

라디오 버튼을 다루기 위해서 2가지의 함수가 사용되었는데 이는 isChecked()와 setChecked()이다. 이들의 역할은 아래와 같다. 

  • isChecked() : 체크가 되었으면 True, 아니면 False을 반환한다.
  • setChecked()  : 인자로 True가 들어오면 버튼을 활성화하고 아니면 버튼을 비활성화한다. 

해당 코드로 프로그램을 실행하면, 처음 푸시 버튼 라디오버튼 1이 활성화되고 계속 연타하다 보면 라디오버튼 1과 라디오버튼 2가 왔다 갔다 하면서 활성화하는 것을 볼 수 있다. 

 

참고로 이 isChecked()와 setChecked() 함수는 체크 박스에서도 사용 가능함으로 체크 박스도 위와 같은 로직으로 처리할 수 있으니 참고 바란다. 

'FrameWork/PyQT'의 다른글

  • 현재글 파이썬 라이브러리 PyQT을 통해 여러 종류의 버튼을 생성하고 이벤트 연결하기

관련글