QPushButton - 버튼 이벤트 처리

 

파이큐티5의 버튼 이벤트 처리에 대하여 알아본다.

 

간단한 버튼을 만들기 위해 레이아웃은 QVBoxLayout 을 사용한다. QPushButton 클래스로 버튼을 생성한다. 레이블이나 버튼이나 생성 방법에 큰 차이가 없다. 레이블은 그냥 텍스트로 보여지지만 버튼은 텍스트 뿐 아니라 이벤트 처리 기능을 만들어야 한다.

 

윗부분 코드는 버튼을 생성하기 위한 코드이고 아랫 부분은 버튼 클릭 이벤트 발생시 처리내용을 담은 코드이다.

 

생성하려는 버튼에 표시할 문자열을 주고 레이아웃에 더하기만 하면 된다. 이벤트 처리기는 별도로 button.clicked.connect 에 등록한다. 클릭했을 때 발생하는 일들을 클래스 내의 메소드를 만들어 주면된다.

 

레이블을 만들어서 버튼을 클릭할 때 마다 카운터가 오르도록 하였다.

 

버튼을 클릭할 때 마다 콘솔창과 레이블에 결과값이 반영된다.

 

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.count = 0
        self.initialize()

    def initialize(self):
        self.setGeometry(300, 300, 400, 300)
        layout = QVBoxLayout()
        self.setLayout(layout)

        self.label = QLabel("PyQt5 Ex!")
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QtGui.QFont('Hack', 15))
        layout.addWidget(self.label)

        button = QPushButton("Press Button!")
        button.clicked.connect(self.button_clicked)
        button.setFont(QtGui.QFont('Hack', 15))
        layout.addWidget(button)


    def button_clicked(self):
        print("Button Clicked", self.count)
        # QMessageBox.about(self, "Alert", "Clicked!")
        self.count += 1
        self.label.setText("Count " + str(self.count))


app = QApplication(sys.argv)
screen = Window()
screen.show()
sys.exit(app.exec_())

 

QRadioButton - 버튼 이벤트처리

 

클래스의 생성과 이벤트 처리에 관하여 라디오 버튼도 크게 다르지는 않다. 아래와 같은 창을 만든다.

 

QRadioButton 을 이용해서 라디오버튼을 생성한다. setChecked는 초기값을 지정하는 것이다. 선택되었으면 True를 한다. 라이오 버튼은 묶음의 개념이 있다. 한 그룹에 선택되는 버튼은 한개니까 여러개에 True를 하지 않도록 한다.

 

radiobutton 인스턴스는 자신을 담고 있는 컨테이너안에서 자동으로 그룹이 된다. 하나를 선택하면 선택된 다른 하나의 값은 풀린다. toggled.connect 메서드는  이벤트 처리기에 연결되있다.

 

 

결과창은 아래와 같다. 간단한 코드로도 이벤트 처리가 잘 되는 것을 확인할 수 있다.

 

 

버튼 클릭시 이벤트가 어떻게 발생하는지만 알아도 이미 완성도 높은 프로그램을 짤 수가 있다. 버튼을 클릭하면서 표시되는 텍스트를 조작하게 하는 것이 기본 입출력이 되고 사용자 UI가 된다.

 

간단한 코드로도 충분히 잘 사용할 수 있으니 자신만의 GUI 프로그램을 만들어본다.

 

* 예제코드

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.count = 0
        self.initialize()

    def initialize(self):
        self.setGeometry(300, 300, 400, 300)
        layout = QVBoxLayout()
        self.setLayout(layout)

        self.label = QLabel("Radio Button EX")
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QtGui.QFont('Hack', 15))
        layout.addWidget(self.label)

        self.radioButton = QRadioButton("Korea")
        self.radioButton.setChecked(True)
        self.radioButton.setFont(QtGui.QFont('Hack', 15))
        self.radioButton.toggled.connect(self.on_clicked)
        layout.addWidget(self.radioButton)

        self.radioButton = QRadioButton("Japan")
        self.radioButton.setChecked(False)
        self.radioButton.setFont(QtGui.QFont('Hack', 15))
        self.radioButton.toggled.connect(self.on_clicked)
        layout.addWidget(self.radioButton)

        self.radioButton = QRadioButton("China")
        self.radioButton.setChecked(False)
        self.radioButton.setFont(QtGui.QFont('Hack', 15))
        self.radioButton.toggled.connect(self.on_clicked)
        layout.addWidget(self.radioButton)

    def on_clicked(self):
        radio = self.sender()
        if radio.isChecked():
            self.label.setText("You selected " + radio.text())
            print("checked " + radio.text())


app = QApplication(sys.argv)
screen = Window()
screen.show()
sys.exit(app.exec_())

공유하기

facebook twitter kakaoTalk kakaostory naver band