1. Introduction
PySide6 입문 과정 내용입니다. PySide6는 무료 GUI 라이브러리로서 Python IDLE('아이들'이라고 읽음)과는 별도로 설치 과정이 필요한 외부 모듈입니다. PyQt6와 비교해서 성능이나 기능이 동등하면서도 배포 수정 문제와 관련해서 라이선스 조건이 비교적 자유롭습니다. PySide6는 내부적으로 PyQt6와 거의 같습니다. 라이선스 문제만 다르다고 봐도 무방합니다. 사용법은 거의 비슷하고 성능도 별 차이가 나지 않습니다.
다만, 최신 참고서류가 희소한 편입니다.
추천 : tkinter, wxPython, PySide6, kivy.
1.1 PySide6 설치 여부 검사
Python Shell에서 입력, import 테스트를 실행하면 간단하게 해결됩니다.
- 대소문자를 반드시 구분할 것.
- 정확한 이름 : PySide6
- 틀린 이름 : pyside6
1.2 import 테스트
테스트 입력이 정상인 경우 : '라이브러리 모듈' 이름을 정상 입력한 경우임. 오류 피드백 없음.
입력 :
>>>import PySide6
결과 :
>>>_
만략 PySide6가 설치되어 있지 않다면, 이 테스트에서 에러가 발생합니다. 설치되어 있지 않으니 당연히 import 불러오기가 불가능합니다. PySide6를 설치하면 해결됩니다.
1.3 PySide6 설치
PySide6가 설치되어 있지 않다고 판단되면, 다음 절차에 따라 PySide6 '라이브러리 모듈'을 설치합니다.
'인터넷 연결이 되어 있는 상태'에서, 별도의 다운로드 과정없이 다음 절차를 따르면 됩니다.
1) 전제 1 : 먼저, 기본 표준 Python이 설치되어 있어야 합니다. (v3.12.xx에서 테스트됨)
2) 전제 2 : CMD 창이나 PowerShell 창에서 pip 명령이 정상적으로 작동해야 합니다.
3) 설치 방법 : 보통, 설치 명령은 CMD 창에서 관리자 권한으로 하시면 됩니다. 다음 두 방법 중에서 한 가지 선택할 것.
a. Windows 11 / 시작 버튼 / 검색 / 'CMD' 키워드를 검색창에 입력 / 오른쪽 하단 결과 목록에서, '관리자 권한으로 실행' 선택 / CMD 창이 열림
b. Windows 11 / 시작 버튼 / 터미널(관리자) / PowerShell 창이 열림.
CMD 창이 열린 경우 :
C:\Windows\System32>pip install pyside6
PowerShell 창이 열린 경우 :
PS C:\Users\User> pip install PySide6
주의 : 인터넷 연결이 반드시 필요합니다.
별도의 다운로드 과정이 없지만, 설치 과정 자체가 인터넷에서 다운로드 받으면서 설치되기 때문입니다.
pip 방식의 설치 과정은 대부분 동일합니다. 인터넷 연결 필수, 유선 인터넷 혹은 와이파이 연결 상태 확인이 필요함.
# 중급 : (입문자는 패스! ^.^; ) 실제 설치 과정 진행은 보통 다음 절차를 따릅니다.
:: 실제 설치 과정 진행 ::
CMD 창이 열린 경우 :
C:\Windows\System32>pip install pyside6
PowerShell 창이 열린 경우 :
PS C:\Users\User> pip install PySide6
A. 설치 관련 Meta Data 정보 모으기 과정
Collecting pyside6
Downloading pyside6-6.11.2-cp310-abi3-win_amd64.whl.metadata (5.4 kB)
Collecting shiboken6==6.11.2 (from pyside6)
Downloading shiboken6-6.11.2-cp310-abi3-win_amd64.whl.metadata (2.5 kB)
Collecting PySide6_Essentials==6.11.2 (from pyside6)
Downloading pyside6_essentials-6.11.2-cp310-abi3-win_amd64.whl.metadata (3.8 kB)
Collecting PySide6_Addons==6.11.2 (from pyside6)
Downloading pyside6_addons-6.11.2-cp310-abi3-win_amd64.whl.metadata (4.2 kB)
B. 설치에 필요한 파일들을 실제로 다운로드 과정
Downloading pyside6-6.11.2-cp310-abi3-win_amd64.whl (578 kB)
---------------------------------------- 578.4/578.4 kB 6.7 MB/s 0:00:00
Downloading pyside6_addons-6.11.2-cp310-abi3-win_amd64.whl (168.2 MB)
---------------------------------------- 168.2/168.2 MB 10.3 MB/s 0:00:16
Downloading pyside6_essentials-6.11.2-cp310-abi3-win_amd64.whl (76.9 MB)
---------------------------------------- 76.9/76.9 MB 10.6 MB/s 0:00:07
Downloading shiboken6-6.11.2-cp310-abi3-win_amd64.whl (1.2 MB)
---------------------------------------- 1.2/1.2 MB 8.8 MB/s 0:00:00
C. 실제 설치 과정
Installing collected packages: shiboken6, PySide6_Essentials, PySide6_Addons, pyside6
D. 설치 후 정리 과정
Successfully installed PySide6_Addons-6.11.2 PySide6_Essentials-6.11.2 pyside6-6.11.2 shiboken6-6.11.2
# 설치 과정을 성공적으로 마쳤다는 메시지입니다.
.
.
2. Code
# 샘플 코드 :
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLabel
def change_text():
label.setText("Button clicked!")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Click Test")
window.resize(640, 360)
label = QLabel("Hello, World!", window)
label.setFixedWidth(120)
label.move(100, 50)
button = QPushButton("Click me", window)
button.setFixedWidth(120)
button.move(100, 90)
button.clicked.connect(change_text)
"""
고정 너비: setFixedWidth(숫자)
고정 크기: setFixedSize(가로, 세로)
범위 제한: setMinimumWidth(), setMaximumWidth()
"""
window.show()
sys.exit(app.exec())
# 이하에서는 단계적으로 살펴보겠습니다.
""" PySide6 설치 후 작동 테스트를 위한 기본 코드입니다.
이 앱은 PySide6 설치 직후에 하는 작동 테스트용으로,
- 기본 GUI 창을 하나 만들고
- 버튼 하나를 추가한 후,
- 마우스 클릭에 대한 이벤트 핸들러 함수 하나를 작성하고
- 이것을 실행합니다.
- 하지만, 단계적으로 나누어 관련 코드들을 추가하겠습니다. """
""" 예제 1. 가장 기본: 창 하나 띄우기. 기본 표준 Python에서 테스트해보세요. """
import sys
from PySide6.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Hello, World!")
window.resize(300, 200)
window.show()
sys.exit(app.exec())
"""
예제 1. Notes :
이 코드는 PySide6의 최소 골격입니다.
핵심은 다음 4개입니다.
QApplication: GUI 프로그램의 기본 엔진
QWidget: 창 또는 위젯의 기본 단위
show(): 화면에 표시
app.exec(): 이벤트 루프 시작
"""
""" 예제 2. 버튼 하나 추가하기 """
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Button Test")
window.resize(300, 200)
button = QPushButton("Click me", window)
button.move(100, 80)
window.show()
sys.exit(app.exec())
"""
예제 2. Notes :
여기서는 버튼을 창 안에 넣었습니다.
아직은 레이아웃 없이 위치를 직접 지정하는 방식이라 매우 단순합니다.
아직은 버튼을 클릭해도 아무 일도 일어나지 않습니다.
"""
""" 예제 3. 함수를 추가하고 이벤트와 연결하기 """
import sys
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QLabel
def show_text():
label.setText(input_box.text())
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Input Test")
window.resize(300, 200)
input_box = QLineEdit(window)
input_box.move(50, 50)
input_box.resize(200, 30)
button = QPushButton("Show", window)
button.move(100, 90)
button.clicked.connect(show_text)
label = QLabel("...", window)
label.move(50, 130)
window.show()
sys.exit(app.exec())
""" 예제 3 Notes :
여기서 중요한 개념은:
- clicked
- connect()
- 함수와 이벤트 연결
즉, GUI는 “그려진 뒤 끝나는 것”이 아니라,
사용자 행동에 반응하는 구조라는 점을 처음 체감할 수 있습니다.
"""
""" 예제 4. 라벨 추가, 입력창 추가, 입력창에 쓴 내용을 라벨에 표시하기 """
import sys
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QLabel
def show_text():
label.setText(input_box.text())
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Input Test")
window.resize(300, 200)
input_box = QLineEdit(window)
input_box.move(50, 50)
input_box.resize(200, 30)
button = QPushButton("Show", window)
button.move(100, 90)
button.clicked.connect(show_text)
label = QLabel("...", window)
label.move(50, 130)
window.show()
sys.exit(app.exec())
"""
이 예제는 입문용으로 적당합니다.
GUI의 핵심 요소 3개가 모두 포함되어 있습니다.
- 입력 받기
- 버튼 클릭
- 결과 출력
"""
""" 예제 5. 레이아웃 도입 - 조금 더 보기 좋은 형태: 세로 배치 """
import sys
from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QLabel, QPushButton
)
# import 부분도 이렇게 괄호를 사용해서
# 코드를 좀 더 읽기 좋게 다듬을 수도 있습니다.
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Layout Test")
layout = QVBoxLayout()
label = QLabel("Hello, World!")
button = QPushButton("Click me")
def change_text():
label.setText("Changed!")
button.clicked.connect(change_text)
layout.addWidget(label)
layout.addWidget(button)
window.setLayout(layout)
window.show()
sys.exit(app.exec())
"""
이 예제부터는 레이아웃이 포함됩니다.
직접 위치를 지정하는 것보다 훨씬 실용적이고, PySide6를 쓰는 감각이 더 생깁니다.
다만, 현재는 사용법만 보여주는 코드로 특별한 기능이 없습니다. 하지만, layout을 사용하면
이후 강화된 여러 기능들을 쓸 수 있기 때문에 적극 권장됩니다.
주목 :
layout.addWidget(label)
layout.addWidget(button)
window.setLayout(layout)
"""
3. Result

4. Notes
1) 버튼이나 라벨의 크기 조절 : 속성 메서드 함수를 통해서 조절함. 생성자에서 직접 지정하는 방법은 없는 듯. ^.^; width 옵션 등 안 먹힘. 해 봤습니다. ㅋ...
예 :
# 지원되는 방식 : 정상 작동
button = QPushButton("Click me", window)
button.setFixedWidth(120)
# 지원되지 않는 방식 : 에러 발생
button = QPushButton("Click me", window, width=120)
"""
고정 너비: setFixedWidth(숫자)
고정 크기: setFixedSize(가로, 세로)
범위 제한: setMinimumWidth(), setMaximumWidth()
"""
2) app과 window의 자동 연결 (중급/고급)
보충 학습 : app과 window의 자동 연결 (중급/고급)
# app과 window는 내부적으로 자동 연결됨. 처음에는 어리둥절하겠지만.
app = QApplication(sys.argv)
window = QWidget()
......
sys.exit(app.exec())
■ PySide6의 구조상 QApplication이 먼저 만들어지고, 그 다음에 위젯(window)을 만들면 그 앱 안에서 관리되는 것이라고 이해하면 됩니다.
- app은 GUI 프로그램 전체를 돌리는 운영 주체
- window는 그 안에 들어가는 창 위젯
즉, window가 app 객체에 직접 “붙는다”기보다,
QApplication이 현재 실행 중인 애플리케이션 컨텍스트를 제공하고, 그 안에서 생성된 위젯들이 관리됩니다.
■ 왜 연결고리가 안 보이나?
파이썬 코드에서는 이런 식의 명시적 연결이 없어 보여도, Qt 내부에서는 :
- QApplication이 이벤트 루프를 담당하고,
- QWidget 같은 위젯들이 그 이벤트 루프의 대상이 되며,
- show()를 호출하면 해당 위젯이 화면에 나타납니다.
즉, 위젯은 앱 객체를 직접 참조하지 않아도, Qt 프레임워크가 내부적으로 관리합니다.
■ 비유하면
- QApplication = 공연장 전체 운영 시스템
- window = 무대 위 배우
- show() = 배우가 무대에 등장하는 행동
배우가 운영 시스템에 “나를 등록해줘”라고 직접 말하지 않아도,
공연장 시스템 안에서 무대에 오르면 관객 앞에 보이게 되는 것과 비슷합니다.
■ 꼭 기억할 점
QApplication은 반드시 먼저 생성해야 합니다.
이유는 Qt 위젯들이 동작할 기반 환경이 필요하기 때문입니다.
■ 순서 : 그래서 만들어지는 순서는 중요합니다.
app = QApplication(sys.argv)
window = QWidget()
window.show()
sys.exit(app.exec())
요약 : 명시적으로 연결 코드를 쓰지 않아도, QApplication이 전체 GUI 환경을 제공하고 window는 그 안에서 자동으로 관리됩니다.
■ 명시적 연결 예
# 부모/자식 구조로 연결하기
window = QWidget()
button = QPushButton("Click me", window)
여기서 window를 버튼의 부모(parent) 로 명시했습니다. 즉, 버튼은 창 안에 들어가는 자식 위젯이 됩니다.
이건 아주 중요한 “명시적 연결”입니다. Qt에서는 위젯 간 관계를 부모-자식 구조로 자주 표현합니다.
결론 : app과 window는 명시적 부모/자식 연결이 아니라, 프레임워크 구조에 의한 연결입니다.
.
.
3) 입문 과정의 주요 학습 목록
입문 과정 학습자용으로 추천되는 추가 학습 목록입니다. 너무 어렵거나 복잡한 것은 싫어요. ^.^;
- 창 띄우기
- 버튼 넣기
- 클릭 이벤트 연결하기
- 입력창 만들기
- 레이아웃 적용하기
- 작은 카운터 앱 만들기
- 간단한 다이얼로그 띄우기
PySide6의 기본 흐름은 이 정도로 충분하다고 생각됩니다. 가끔 용어가 이상한 것들도 약간씩 등장하는데, '쫄' 필요는 없습니다. 알고보면 별 것 아니니까요.
PySide6는 처음엔 아래 3가지만 익히면 됩니다.
- 위젯 : 화면에 놓는 요소
- 레이아웃 : 위젯을 배치하는 방식
- 시그널/슬롯 : 이벤트와 동작 연결*
이 셋만 감이 잡혀도, 아주 단순한 앱은 바로 만들 수 있습니다. 위젯의 갯수가 많지만, 다다익선. 천천히 필요한 것들만 우선적으로 하나씩 익혀나가면 됩니다.
4) 시그널/ 슬롯(??)
용어가 어렵죠? 시그널/슬롯은 PySide6에서 가장 중요한 개념 중 하나지만, 처음엔 이름이 낯설어서 어렵게 느껴질 수 있습니다. 처음에는 에에...엥(?) 했습니다. 쉽게 말하면 :
- 시그널(signal) = “무언가 일어났다는 신호” (= 이벤트)
- 슬롯(slot) = “그 신호를 받았을 때 실행할 동작” (= 이벤트 핸들러 함수)
즉, GUI에서는 버튼을 눌렀다, 텍스트가 바뀌었다, 엔터를 눌렀다 같은 일이 발생하면 그것을 시그널로 보내고,
그 신호를 받았을 때 실행되는 함수가 슬롯입니다. 즉, 이벤트와 이벤트 핸들러 함수와 같은 뜻입니다.
이벤트는 사건 발생(예, 마우스 클릭 사건),
이벤트 핸들러 함수는 사건 발생에 따른 처리할 내용.
줄여서, 사건과 할 일.
button.clicked.connect(show_message)
이 한 줄은 이렇게 이해하면 됩니다.
button.clicked --> 버튼이 눌렸을 때 발생하는 시그널
.connect(...) --> 그 시그널과 함수를 연결
show_message --> 신호가 오면 실행할 슬롯
즉, “버튼이 클릭되면 show_message 함수를 실행해라”
라는 뜻입니다.
GUI는 사용자가 언제 무엇을 할지 미리 정해져 있지 않습니다.
그래서 프로그램이 순서대로만 실행되는 게 아니라, 이벤트가 생길 때마다 반응해야 합니다.
시그널/슬롯 구조는 바로 이 이벤트 중심 구조를 다루기 좋게 만든 방식입니다.
5) 시그널/슬롯 이해를 위한 쉬운 예제
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLabel
import sys
def say_hello():
label.setText("Hello!")
app = QApplication(sys.argv)
window = QWidget()
button = QPushButton("Click me", window)
label = QLabel("Waiting...", window)
label.move(0, 40)
button.clicked.connect(say_hello)
window.show()
sys.exit(app.exec())
■ 기본 흐름 :
- 사용자가 버튼을 누름
- clicked 시그널 발생
- say_hello 슬롯 실행
- 라벨 글자가 바뀜
■ 시그널/슬롯 한 줄 정의 :
- 시그널 = 사건 발생 알림
- 슬롯 = 그 알림에 반응하는 함수
■ 요약 정리 :
만약 Python 함수 호출이 '내가 직접 지정한 이 함수를 부른다”라면,
시그널/슬롯은 “일이 생기면 Qt가 알아서 지정한 이 함수를 불러준다”에 가깝습니다.
■ 응용 연습 과제
1) ...
2) ...
5. Files
Not yet! 짧은 것들이라. 타이핑 연습용으로. ^.^;
6. Ref.
국내에는 PySide6에 대한 교재가 아직 없는 듯 합니다만, 좀 이전에 출간된 PyQt6를 대신 활용할 수 있을 듯합니다. 내용은 비슷합니다만 완전 입문용 초보자용은 아닙니다. 그래도 Python 기본 교재(강환수, 신용현님 교재 추천) 한 권 정도를 마스터하시면 충분히 보실 수 있습니다. 그렇게 어렵지는 않습니다.
마틴 피츠패트릭의 PyQt6 교재가 유일합니다만, 한글판 번역평은 좀 좋지 않네요. 영어 공부 겸해서 영어판을 직접 보시든가, 중고도 좋을 듯. 한영 비교해서 보시면 가장 좋을 듯 합니다.
1) 마틴 피츠패트릭, [ 파이썬과 Qt6로 GUI 애플리케이션 만들기 5/e ]
2) 마틴 피츠패트릭, 위 책 영어 원서. Create GUI Applications with Python & Qt6 (6th Edition, PyQt6) (알라딘)
3) 마틴 피츠패트릭, PySide6 영어판도 있습니다. 이 책의 한국어판은 아직 없습니다. PySide6 (아마존)
4) 기타 이미 출간된 여러 PyQt5 관련 도서들도 도움이 됩니다. 사용법은 비슷합니다.
Happy Programming!
^.^;
'Programming > Python' 카테고리의 다른 글
| wx.Sizer() (0) | 2026.09.20 |
|---|---|
| Syndia (v.0.0.3) (0) | 2026.09.15 |
| wxPython 기본 위젯 - 003 - Panel, Sizer, Menu, Status Bar (0) | 2026.09.07 |
| wxPython 기본 위젯 - 002 - Panel Container Widget (0) | 2026.09.06 |
| Python Class - 001 (0) | 2026.08.30 |