종합 PyQt5 튜토리얼: 파이썬으로 전문 GUI 애플리케이션 구축하기
PyQt란 무엇인가?
PyQt는 크로스 플랫폼 C++ 라이브러리인 Qt 프레임워크의 파이썬 바인딩으로, Windows, macOS, Linux, Android, iOS, 라즈베리파이 등에서 네이티브 GUI 애플리케이션을 만드는 데 사용됩니다. 바인딩은 Riverbank Computing(영국)에서 유지보수하며, Qt 자체는 The Qt Company(핀란드)에서 개발합니다. PyQt는 파이썬 개발자에게 Qt의 풍부한 위젯, 네트워킹, 데이터베이스, 3D, 멀티미디어 기능에 접근할 수 있게 합니다.
이 튜토리얼에서 배울 내용:
- PyQt5의 주요 특징
- 사용 가능한 PyQt 버전
- Windows, macOS, Linux에 PyQt5 설치 방법
- PyQt 기본 개념과 샘플 프로그램
- 핵심 컴포넌트와 위젯
- 레이아웃 전략과 테마 커스터마이징
PyQt5의 주요 특징
PyQt5는 600개 이상의 클래스를 노출하며 다음을 다룹니다:
- 그래픽 사용자 인터페이스
- SQL 데이터베이스 통합(SQLite, MySQL, PostgreSQL, Oracle, ODBC)
- QtWebEngine을 통한 웹 렌더링
- XML 파싱과 조작
- 강력한 네트워킹(TCP/UDP, SSL, DNS)
- 멀티미디어와 3D 그래픽(QtMultimedia, Qt3D)
이 기능들로 개발자는 복잡하고 고성능의 데스크톱 및 임베디드 애플리케이션을 구축할 수 있습니다. LG, 메르세데스-벤츠, AMD, 파나소닉, 하만 등 주요 기업이 UI 스택으로 Qt를 활용합니다.
PyQt 버전
Riverbank Computing은 두 가지 주요 바인딩을 제공합니다:
- PyQt4 – Qt 4.x와 5.x 모듈 지원(하위 호환성 없음)
- PyQt5 – Qt 5.x 전용 바인딩
또한 PyQt3D는 실시간 3D 렌더링과 시뮬레이션에 유용한 Qt3D 프레임워크의 파이썬 바인딩을 제공합니다.
PyQt5 설치
아래 두 가지 일반적인 설치 방법을 설명합니다. 컴파일된 C++ 바이너리를 포함하고 긴 빌드 과정을 피할 수 있는 휠 패키지 사용을 권장합니다.
방법 1: 휠 패키지로 설치 (권장)
- 선호하는 터미널이나 명령 프롬프트 열기
pip install PyQt5 실행하여 휠 다운로드(약 50MB)
- 설치가 성공적으로 완료되었는지 확인
Windows 예시:
pip install PyQt5
설치 후 PyQt5.QtWidgets를 임포트하여 애플리케이션 구축 시작.
방법 2: 소스에서 빌드
소스 빌드는 C++ 코드 컴파일이 필요해 더 복잡합니다. 맞춤 수정이 필요하거나 본인 플랫폼용 휠이 없을 때만 필요합니다.
PyQt5 프로그래밍 기초
아래는 "Guru99"라는 제목의 300x300 창을 여는 최소 예제입니다. 각 줄에 주석을 달았습니다.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
w.show()
sys.exit(app.exec_())
설명:
QApplication – 핵심 이벤트 루프
QWidget – 모든 UI 컴포넌트의 베이스 클래스
resize() – 창 크기 설정
setWindowTitle() – 타이틀바 텍스트 정의
show() – 위젯 표시
app.exec_() – 이벤트 루프 시작, 창이 닫힐 때까지 블록
인터랙티비티 추가
다음 예제는 라벨, 버튼, 버튼 클릭 시 나타나는 메시지 박스를 추가합니다. 시그널과 슬롯, Qt 이벤트 시스템의 핵심을 보여줍니다.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
def dialog():
mbox = QMessageBox()
mbox.setText("Your allegiance has been noted")
mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
mbox.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
label = QLabel("Behold the Guru, Guru99", w)
label.move(100, 130)
btn = QPushButton("Beheld", w)
btn.move(110, 150)
btn.clicked.connect(dialog)
w.show()
sys.exit(app.exec_())
버튼 클릭 시 dialog()가 호출되어 모달 QMessageBox를 생성합니다.
핵심 컴포넌트와 위젯
PyQt5 아키텍처는 여러 모듈로 구성됩니다. 이 계층을 이해하면 필요한 것만 임포트할 수 있습니다.
모듈 개요
- Qt – 모든 서브모듈 통합; 소규모 스크립트에 편리
- QtCore – 비GUI 핵심 클래스(시그널, 슬롯, 타이머)
- QtWidgets – 표준 GUI 위젯(버튼, 라벨 등)
- QtGui – 그래픽 프리미티브와 고급 페인팅
- QtNetwork – TCP/UDP 소켓, SSL, DNS
- QtMultimedia – 오디오/비디오 지원
- QtSql – 데이터베이스 통합
자주 쓰는 위젯
QLineEdit – 한 줄 텍스트 입력
QRadioButton – 선택 가능한 라디오 버튼
QComboBox – 드롭다운 선택기
QCheckBox – 토글 박스
QMenuBar – 수평 메뉴 바
QToolBar – 버튼이 있는 툴바
QTabWidget – 탭 인터페이스
QScrollBar – 스크롤바 위젯
QSplitter – 크기 조절 가능한 분할 뷰
QDockWidget – 분리 가능한 독 패널
레이아웃 관리
move()와 resize()로 위젯을 수동 배치하는 대신, Qt는 창 크기에 따라 위젯을 자동 배치하는 레이아웃 매니저를 제공합니다.
박스 레이아웃 (HBox & VBox)
QHBoxLayout은 위젯을 수평으로, QVBoxLayout은 수직으로 배치합니다.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
app = QApplication([])
win = QWidget()
win.setWindowTitle("Musketeers")
btn1 = QPushButton("Athos")
btn2 = QPushButton("Porthos")
btn3 = QPushButton("Aramis")
hbox = QHBoxLayout(win)
hbox.addWidget(btn1)
hbox.addWidget(btn2)
hbox.addWidget(btn3)
win.show()
app.exec_()
QHBoxLayout을 QVBoxLayout으로 바꾸면 버튼이 수직으로 쌓입니다.
그리드 레이아웃
위젯을 2차원 그리드에 배치합니다. addWidget() 메서드는 행과 열 인덱스, 선택적 행/열 병합 인자를 받습니다.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication([])
win = QWidget()
layout = QGridLayout(win)
for i in range(3):
for j in range(3):
layout.addWidget(QPushButton(f"Button {i},{j}"), i, j)
win.show()
app.exec_()
커스텀 테마와 스타일
PyQt5는 네이티브 테마와 커스텀 스타일시트를 지원합니다.
내장 테마
app.setStyle("Fusion") 또는 다른 사용 가능한 스타일로 애플리케이션 스타일 설정.
app = QApplication([])
app.setStyle("Fusion")
팔레트 커스터마이징
QPalette로 위젯 색상을 프로그래밍 방식으로 수정.
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.black)
palette.setColor(QPalette.Window, Qt.black)
palette.setColor(QPalette.Button, Qt.gray)
app.setPalette(palette)
Qt 스타일 시트 (CSS 스타일)
고급 스타일링을 위해 위젯이나 전체 애플리케이션에 스타일시트 직접 적용.
btn.setStyleSheet("background-color: #4CAF50; color: white; padding: 5px;")
핵심 요약
- PyQt5는 Qt 프레임워크의 강력한 파이썬 바인딩으로 크로스 플랫폼 데스크톱, 임베디드, 모바일 앱에 적합
- 설치는 휠 패키지 권장; 소스 빌드는 선택 사항
- 핵심 모듈: QtCore, QtGui, QtWidgets, QtNetwork, QtMultimedia, QtSql
- 위젯: 버튼, 라벨, 텍스트 필드, 라디오 버튼, 체크박스, 메뉴, 툴바, 탭, 스플리터, 독
- 인터랙티비티는 Qt의 시그널과 슬롯 메커니즘에 의존
- 레이아웃(박스, 그리드)이 위젯 배치를 자동화하여 반응형 개선
- 테마는 내장 스타일, 팔레트, Qt 스타일 시트로 구현 가능
- Qt Designer와 Qt Creator로 UI 설계와 애플리케이션 패키징 간소화