GUI(Graphical User Interface)는 사용자가 명령어를 직접 입력하지 않고, 버튼, 창, 입력창, 메뉴와 같은 화면 요소를 통해 프로그램을 사용할 수 있게 해주는 인터페이스이다. 계산기, 메모장, 파일 탐색기, 디스코드, 웹 브라우저 같은 프로그램 대부분은 GUI를 기반으로 동작한다.
이번 글에서는 GUI 개발의 기본 개념부터 Qt와 PySide6의 관계, 위젯, 레이아웃, 시그널과 슬롯, 이벤트 루프까지 설명하도록 하겠다.
1. GUI의 기본 개념
GUI는 사용자가 프로그램을 더 쉽게 사용할 수 있도록 화면 요소를 제공하는 방식이다.
터미널 환경에서는 사용자가 직접 명령어를 입력해야 한다.
mkdir testcd testpython main.py하지만 GUI 환경에서는 버튼을 클릭하거나 메뉴를 선택하는 방식으로 프로그램을 사용할 수 있다.
1.1 GUI 프로그램의 주요 요소
GUI 프로그램에서 자주 사용되는 요소는 다음과 같다.
| 요소 | 설명 |
|---|---|
| Window | 프로그램의 기본 창 |
| Button | 사용자가 클릭할 수 있는 버튼 |
| Label | 텍스트나 이미지를 보여주는 요소 |
| LineEdit | 사용자가 글자를 입력하는 칸 |
| Menu | 기능을 모아둔 메뉴 |
| Dialog | 알림창이나 설정창처럼 따로 뜨는 창 |
GUI 개발은 단순히 화면을 만드는 것이 아니라, 사용자의 행동에 따라 프로그램이 어떻게 반응할지 정하는 과정이다.
2. Qt와 PySide6
Qt는 GUI 프로그램을 만들기 위한 프레임워크이다. 주로 C++에서 많이 사용되며, 창, 버튼, 입력창, 메뉴 같은 GUI 요소를 만들 수 있게 해준다.
PySide6는 Qt를 Python에서 사용할 수 있게 해주는 라이브러리이다. 즉, C++에서 많이 사용되는 Qt의 기능을 Python 코드로 사용할 수 있게 해주는 도구라고 할 수 있다.
2.1 Qt와 PySide6의 관계
| 이름 | 설명 |
|---|---|
| Qt | C++ 기반 GUI 프레임워크 |
| PySide6 | Qt를 Python에서 사용할 수 있게 해주는 라이브러리 |
| Python GUI 개발 | Python 코드로 창, 버튼, 입력창 등을 만드는 작업 |
PySide6를 사용하면 Python으로도 데스크톱 GUI 프로그램을 만들 수 있다.
3. PySide6 프로그램의 기본 구조
PySide6 프로그램은 보통 다음과 같은 흐름으로 동작한다.
| 단계 | 설명 |
|---|---|
| QApplication 생성 | GUI 프로그램 전체를 관리 |
| Window 생성 | 사용자에게 보여줄 창 생성 |
| Widget 생성 | 버튼, 라벨, 입력창 같은 요소 생성 |
| Layout 설정 | 위젯들을 화면에 배치 |
| Signal 연결 | 사용자 행동과 실행할 함수 연결 |
| event loop 실행 | 사용자 입력을 계속 기다리며 처리 |
3.1 기본 코드 예제
import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication(sys.argv)
window = QWidget()window.setWindowTitle("PySide6 Example")
button = QPushButton("Click")
layout = QVBoxLayout()layout.addWidget(button)
window.setLayout(layout)window.show()
sys.exit(app.exec())위 코드는 간단한 창을 만들고, 그 안에 버튼 하나를 배치하는 예제이다.
실행 흐름은 다음과 같다.
프로그램 실행↓QApplication 생성↓창 생성↓버튼 생성↓레이아웃에 버튼 추가↓창 화면에 표시↓이벤트 루프 실행4. 위젯과 레이아웃
PySide6에서 화면을 구성하는 기본 단위는 위젯이다. 위젯은 버튼, 라벨, 입력창처럼 화면에 보이는 요소를 의미한다.
4.1 대표적인 위젯
| 위젯 | 설명 |
|---|---|
| QWidget | 가장 기본이 되는 화면 요소 |
| QPushButton | 버튼 |
| QLabel | 텍스트나 이미지를 표시 |
| QLineEdit | 한 줄 입력창 |
| QMainWindow | 메뉴바, 상태바 등을 포함할 수 있는 메인 창 |
예를 들어 버튼은 다음과 같이 만들 수 있다.
button = QPushButton("확인")4.2 레이아웃
레이아웃은 위젯들을 창 안에 어떻게 배치할지 정하는 방식이다.
대표적인 레이아웃은 다음과 같다.
| 레이아웃 | 설명 |
|---|---|
| QVBoxLayout | 위젯을 세로 방향으로 배치 |
| QHBoxLayout | 위젯을 가로 방향으로 배치 |
| QGridLayout | 위젯을 행과 열 형태로 배치 |
예를 들어 버튼 두 개를 세로로 배치하려면 다음과 같이 작성할 수 있다.
layout = QVBoxLayout()
layout.addWidget(QPushButton("버튼 1"))layout.addWidget(QPushButton("버튼 2"))
window.setLayout(layout)5. 시그널과 슬롯
PySide6에서 중요한 개념 중 하나는 시그널과 슬롯이다.
시그널은 어떤 일이 발생했다는 알림이고, 슬롯은 그 일이 발생했을 때 실행되는 함수이다.
예를 들어 버튼을 클릭하면 clicked라는 시그널이 발생한다. 이 시그널을 함수와 연결하면 버튼을 클릭했을 때 그 함수가 실행된다.
import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
def change_text(): label.setText("버튼이 클릭되었습니다.")
app = QApplication(sys.argv)
window = QWidget()window.setWindowTitle("Signal Slot Example")
label = QLabel("아직 버튼이 클릭되지 않았습니다.")button = QPushButton("클릭")
button.clicked.connect(change_text)
layout = QVBoxLayout()layout.addWidget(label)layout.addWidget(button)
window.setLayout(layout)window.show()
sys.exit(app.exec())위 코드에서 중요한 부분은 다음 코드이다.
button.clicked.connect(change_text)이 코드는 다음과 같은 의미이다.
button이 클릭되면 change_text 함수를 실행해라즉, 사용자가 버튼을 클릭하면 change_text 함수가 실행되고 라벨의 글자가 변경된다.
6. 이벤트 루프
GUI 프로그램은 사용자의 입력을 계속 기다려야 한다. 사용자가 언제 버튼을 누를지, 언제 창을 닫을지 알 수 없기 때문이다.
이때 필요한 것이 이벤트 루프이다.
PySide6에서는 다음 코드가 이벤트 루프를 실행한다.
app.exec()이 코드가 실행되면 프로그램은 바로 종료되지 않고 마우스 클릭, 키보드 입력, 창 닫기 같은 이벤트를 계속 기다린다.
즉, GUI 프로그램은 위에서 아래로 한 번 실행되고 끝나는 것이 아니라, 사용자의 행동을 기다리며 계속 동작하는 구조이다.
오늘은 GUI의 기본 개념과 Qt, PySide6, 위젯, 레이아웃, 시그널과 슬롯, 이벤트 루프에 대해 알아보았다.
Qt는 C++에서 많이 사용되는 GUI 프레임워크이고, PySide6는 Qt를 Python에서 사용할 수 있게 해주는 라이브러리이다. PySide6를 사용하면 Python 코드로 창, 버튼, 입력창 같은 GUI 요소를 만들 수 있다.
이번 학습을 통해 GUI 프로그램은 단순히 화면을 보여주는 것이 아니라, 사용자의 입력과 이벤트에 반응하며 동작하는 구조라는 점을 이해할 수 있었다. 앞으로는 PySide6의 다양한 위젯과 레이아웃, QSS 스타일링을 더 공부해보고자 한다.