안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
<GUI 프로그래밍 관련 이전 글>
2021.05.08 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프
2021.05.10 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기
지난 시간에는 PyQt가 무엇인지, 대충 어떻게 생겼고 기본적인 창을 만들고 조금조금 바꿔보는 것을 배워봤습니다.
그런데 창 안에는 아무것도 존재하지 않았죠? 오늘은 그 안을 어떤 위젯으로 채울 수 있는지 간단하게 알아보고, 위젯을 조작했을 때 어떤 방식으로 함수와 연결되는지에 대해서 알아보겠습니다.
위젯의 종류
위젯이란 지난 시간 배운 Window라는 Container에 담을 수 있는 내용물을 뜻합니다.
PyQt에는 아래와 같은 위젯들이 존재하며, 각각 다른 모양과 기능을 가지고 있습니다. (여기 있는 것 외에도 위젯들이 있을 수 있습니다)
위젯 종류 | 세부 위젯 종류 |
버튼 | 푸쉬버튼(QPushButton) 라디오버튼(QRadioButton) 체크박스(QCheckBox) |
출력 | 한줄 문자열(QLabel) 여러줄 문자열(QTextBrowser) 사진(QPixmap) 작업진행도(QProgressBar) |
입력 | 한줄 문자열 입력(QLineEdit) 여러줄 문자열 입력(QTextEdit, QPlainTextEdit) 여러 개 선택지 중 하나 선택(QComboBox) 상하 버튼으로 숫자 조절(QSpinBox, QDoubleSpinBox) 슬라이드와 다이얼(QSlider, Qdial) 날짜/시간 (QDateTimeEdit, QDateEdit, QTimeEdit), |
참고로, 우리는 위젯 구성을 다음시간에 배울 Qt Designer라는 프로그램으로 할 것입니다.
아래 이미지는 Qt Desinger의 위젯 상자입니다. 여기서 원하는 위젯을 골라서 '드래그 앤 드롭' 하여 사용할 거예요.
시그널과 슬롯
아직 위젯을 만드는 법은 배우지 않았지만 위젯을 추가했다고 가정해봅시다. 현재의 위젯은 마치 그림의 떡과 같이 아무 쓸모가 없습니다.
그래서 우리는 이 위젯이 어떤 기능을 할 수 있도록 추가적인 코드를 작성해주어야 합니다.
위에서 살펴본 위젯들 중, 가장 기초적인 버튼 위젯을 예로 설명해보겠습니다.
사용자가 버튼을 클릭하는 행위를 입력(Input),
위젯에 어떤 입력이 들어왔을 때 발생하도록 정의된 이벤트를 시그널(Signal),
시그널이 발생했을 때 수행할 함수를 '이벤트 핸들러' 혹은 슬롯(Slot)이라고 합니다.
쉽게 비유하자면 제가 친구의 옆구리를 찌른 것이 '입력'이고, 친구가 받은 옆구리의 통증이 시그널, 친구의 반응이 '슬롯'이죠.
시그널은 위젯마다 다르며, 하나의 위젯에 여러개의 시그널이 존재할 수 있습니다.
이 부분을 하나하나 다루기에는 너무 양이 방대하여 링크로 대신하도록 하겠습니다.
[위키독스] 초보자를 위한 Python GUI 프로그래밍 - PyQt5 (위젯과 레이아웃 링크)
슬롯은 우리가 직접 함수로 정의해주면 됩니다. 아래의 코드를 보시죠.
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
btn = QPushButton("버튼", self)
btn.clicked.connect(self.surprise)
def surprise(self):
print("으엌! 깜짝이야!!")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
app.exec_()
이 코드에서 먼저 입력과 시그널, 슬롯은 무엇일까요?
입력은 '사용자의 물리적인 마우스 클릭과 마우스를 통해 변화된 전자적 입력'입니다.
시그널은 btn.clicked.connect( )에서 .cliked 입니다.
이 코드는 btn이란 이름의 QPushButton의 인스턴스가 클릭되었을 때, ( )안의 메소드(슬롯)와 연결해주는 역할을 하죠.
슬롯은 def surprise(self): 로 정의하였습니다. 이 슬롯은 위에서의 .connect( )로 시그널과 연결되는 것입니다.
이벤트 루프
혹시 지난 시간에 배웠던 코드 중에 닫기 버튼 누를 때 까지 계속 GUI 프로그램을 실행시키는 코드를 기억하시나요?
app.exec_( ) 를 프로그램의 마지막에 입력하시면 루프를 돌며, '닫기' 이벤트가 발생하기 전까지 GUI 창을 계속 띄워놓는 코드입니다.
그래서 이벤트 루프라고 부르며, 이벤트라는 것은 사용자가 마우스클 클릭하거나 키보드를 입력하는 것과 같은 동작을 의미합니다.
참고로, exec_( ) 앞에 붙는 app은 QApplication 클래스의 인스턴스이며, 이름은 app 말고도 원하는대로 지어주시면 됩니다.
exec_( ) 메서드를 호출하면 이벤트 루프가 생성되고 실행됩니다. 이를 보다 명확히 알아보기 위해 다음과 같이 print( ) 함수를 추가해서 커맨드 창을 관찰해보시면 좋을 것 같습니다.
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
btn = QPushButton("버튼", self)
btn.clicked.connect(self.surprise)
def surprise(self):
print("으엌! 깜짝이야!!")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
app.exec_()
#해당 코드 실행 시 부터 이벤트 루프 발생 (즉, 이 코드 아래로는 이벤트 발생 전까지 안내려감)
app.exec_()
print("루프 밖")
이번 시간에는 위젯의 종류와 입력/시그널/슬롯 간의 관계에 대해서 알아보았습니다.
다음 시간에는 Qt Designer를 이용해 위젯을 실제로 구성해보고, 슬롯을 정의해서 연결시켜보면서 실제 프로그램을 만들기 위한 공부를 해보겠습니다.
'파이썬 패키지 > GUI 프로그램' 카테고리의 다른 글
PyQt를 상업적으로 사용하고 싶다면? 정답은 PySide6 (0) | 2022.01.05 |
---|---|
[Python/Pyqt5] QWidget, QMainWindow, Qdialog 차이 총정리 (ft. Modal과 Modeless) (0) | 2021.12.06 |
[파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램 (2) | 2021.05.22 |
[파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기 (0) | 2021.05.10 |
[파이썬 GUI 프로그래밍] PyQt5 기초_1강.PyQt의 개념과 창 만들기 (창 이름, 사이즈, 변경 및 아이콘 삽입) (1) | 2021.05.07 |