손을 흔들며 반갑게 웃는 파이인공지능 파이썬 실무
손을 흔들며 반갑게 웃는 파이

Ⅱ. GUI 프로그래밍 · 주제 07 / 10

PySide6 시작과 Qt Designer

기본 위젯으로 익힌 개념을 Qt Widgets로 옮깁니다.

교과서 확장 학습예제 4개

대단원 Ⅱ. GUI 프로그래밍 교과서 40–59쪽

추가 실습 · 교과서 밖 확장

이 웹 주제의 연계 범위: 확장 학습

웹 학습 주제 07 / 10

PySide6 시작과 Qt Designer

기본 위젯으로 익힌 개념을 Qt Widgets로 옮깁니다.

AT A GLANCE

tkinter 개념을 Qt에 대응해요

  1. 1QApplication 생성
  2. 2위젯과 Layout 구성
  3. 3시그널 연결
  4. 4show → app.exec
tkinterPySide6공통 개념
Tk()QApplication + QWidget앱과 창
command=handlerclicked.connect(handler)이벤트 연결
pack / gridQVBoxLayout / QGridLayout배치 규칙
mainloop()app.exec()이벤트 루프

BEFORE THE CODE

코드 전에 알아 두기

새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.

실행 순서QApplication → 창·레이아웃 → connect → show → exec

tkinter의 Tk·pack·command·mainloop를 Qt 이름으로 옮긴 순서입니다. 단어만 바꾸기보다 역할을 옮기세요.

objectName

Designer가 붙인 부품 이름입니다. 화면에 보이는 text와 다릅니다. 코드는 objectName으로 찾습니다.

RESULT PREVIEW

실행하면 이렇게 보여요

PySide6 최소 창
QApplication → show → exec 순서를 이 창으로 확인합니다. 이 예제를 Linux에서 실행해 캡처한 화면입니다. OS·테마에 따라 외형은 달라집니다.

PC의 프로젝트 폴더에서 python -m venv .venv를 실행합니다. Windows PowerShell은 .venv\Scripts\Activate.ps1, macOS/Linux는 source .venv/bin/activate로 활성화합니다. 이후 python -m pip install PySide6로 설치하고 python main.py로 실행합니다. VS Code에서 같은 .venv 인터프리터를 선택하세요.

첫 예제는 함수 기반으로 QApplication → QWidget → 레이아웃 → 위젯 → connect → show → exec 순서를 익힙니다. 메모장은 QMainWindow를 상속하는 클래스로 상태와 메서드를 묶습니다. self.editor는 여러 메서드에서 같은 입력창을 사용하게 합니다.

Qt Designer는 pyside6-designer로 실행합니다. Widget 폼에 라벨·입력창·버튼을 배치하고 레이아웃을 적용한 다음 form.ui로 저장하세요. pyside6-uic form.ui -o ui_form.py로 Python 코드를 생성할 수 있습니다.

생성 파일은 다시 생성하면 덮어써집니다. 직접 작성하는 main.py에서 Ui_Form을 가져와 setupUi(window)를 호출하고 이벤트를 연결하세요. 버튼의 objectName을 확인해야 코드에서 올바른 이름으로 접근할 수 있습니다. Qt Quick/QML은 별도 UI 기술이며 이번 기본 실습은 Qt Widgets입니다.

이 페이지만 열어도 순서를 실습할 수 있습니다. 최소 창으로 QApplication → show → exec를 확인하고, 인사 앱에서 위젯과 connect를 본 뒤, form.ui를 불러 와 objectName으로 버튼을 연결하세요. Designer의 보이는 글자(text)와 코드가 찾는 이름(objectName)은 다른 속성입니다.

직접 해 보세요

  1. Designer의 objectName과 화면에 보이는 text가 다른 속성임을 확인하세요.
  2. tkinter의 이벤트와 Qt 시그널을 자신의 말로 비교하세요.

이 설명에 이어서 실습하기

예제를 선택하면 바로 아래에서 코드를 수정하고 실행할 수 있습니다. 작성한 코드는 예제별로 저장됩니다.

PySide6 · 최소 창 실행 순서

BEFORE THE CODE

코드 전에 알아 두기

새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.

QApplicationapp = QApplication(sys.argv)

Qt 앱을 하나 만듭니다. 위젯보다 먼저 필요합니다. tkinter의 Tk()가 창과 앱을 겸하는 것과 다릅니다.

QWidgetwindow = QWidget()

빈 창(또는 컨테이너)입니다. setWindowTitle·resize로 제목과 크기를 정합니다.

show / execwindow.show() sys.exit(app.exec())

show는 창을 화면에 올리고, exec는 클릭을 기다립니다. exec를 빼면 프로그램이 바로 끝납니다.

sys.argv

실행 인자 목록입니다. QApplication이 일부 Qt 옵션을 읽을 수 있도록 넘깁니다.

RESULT PREVIEW

실행하면 이렇게 보여요

PySide6 최소 창 · QApplication 실행 순서
위젯을 더하기 전의 빈 창입니다. 이 예제를 Linux에서 실행해 캡처한 화면입니다. OS·테마에 따라 외형은 달라집니다.

인사 앱 · PySide6

BEFORE THE CODE

코드 전에 알아 두기

새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.

QApplicationapp = QApplication(sys.argv)

Qt 앱 객체입니다. 창보다 먼저 만듭니다. tkinter의 Tk()가 창과 앱을 겸하는 것과 다릅니다.

QWidget / setWindowTitlewindow = QWidget() window.setWindowTitle("제목")

빈 창입니다. resize(가로, 세로)로 처음 크기를 정합니다.

QVBoxLayoutlayout = QVBoxLayout(window) layout.addWidget(위젯)

위젯을 위에서 아래로 붙입니다. pack() 대신 레이아웃이 자리를 정합니다.

QLineEditentry = QLineEdit() entry.text() · entry.clear()

한 줄 입력입니다. tkinter Entry의 get/delete에 대응합니다.

clicked.connectbutton.clicked.connect(greet)

클릭 시그널에 함수를 맡깁니다. connect(greet())처럼 괄호를 붙이면 지금 실행됩니다.

app.execsys.exit(app.exec())

이벤트 루프입니다. tkinter의 mainloop에 대응합니다. show() 뒤에 호출합니다.

시그널

위젯이 “클릭됐다”, “글자가 바뀌었다”처럼 알리는 사건입니다. connect로 함수를 연결합니다.

PySide6

Qt의 공식 파이썬 바인딩입니다. 이 과정의 Qt 실습은 Qt Widgets를 사용합니다.

RESULT PREVIEW

실행하면 이렇게 보여요

PySide6 인사 앱 실행 화면 · 이름 입력창과 인사 및 초기화 버튼
같은 인사 앱을 PySide6로 실행한 화면입니다. OS·테마에 따라 외형은 달라집니다.

Qt Designer · .ui 불러와 이벤트 연결

BEFORE THE CODE

코드 전에 알아 두기

새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.

objectNamewindow.nameEdit / window.greetButton

Designer에서 붙인 부품 이름입니다. 화면에 보이는 text와 다릅니다. 코드는 objectName으로 위젯을 찾습니다.

QUiLoader.loadwindow = QUiLoader().load(ui_file)

form.ui를 실행 중에 읽어 창을 만듭니다. 다른 방법은 pyside6-uic form.ui -o ui_form.py로 파이썬을 생성하는 것입니다.

생성 파일과 main.pyfrom ui_form import Ui_Form

uic가 만든 파일은 다시 생성하면 덮어써집니다. 이벤트 연결은 직접 쓰는 main.py에 둡니다.

pyside6-designer

가상환경을 켠 뒤 실행하는 Designer 명령입니다. Widget 폼을 배치하고 form.ui로 저장합니다.

RESULT PREVIEW

실행하면 이렇게 보여요

Qt Designer .ui를 불러 온 인사 폼
objectName으로 입력칸·버튼을 찾아 연결합니다. 이 예제를 Linux에서 실행해 캡처한 화면입니다. OS·테마에 따라 외형은 달라집니다.

메모장 · PySide6 전체 코드

BEFORE THE CODE

코드 전에 알아 두기

새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.

QMainWindowclass MemoWindow(QMainWindow):

메뉴·상태줄·중앙 위젯을 가진 창입니다. 일반 QWidget보다 문서 앱에 맞습니다.

setCentralWidgetself.setCentralWidget(self.editor)

편집기를 창의 가운데에 둡니다. pack이 아니라 메인 창의 중앙 영역입니다.

QActionaction = QAction("열기", self) action.triggered.connect(self.open_file)

메뉴 항목입니다. triggered 시그널이 버튼의 clicked와 같은 역할입니다.

QFileDialogpath, _ = QFileDialog.getOpenFileName(...)

(경로, 선택한 필터) 튜플을 반환합니다. path, _로 받습니다. 취소하면 빈 경로입니다.

setPlainText / toPlainTexteditor.setPlainText(글) editor.toPlainText()

여러 줄 텍스트를 넣거나 읽습니다. QLineEdit의 setText/text와 이름을 구별하세요.

QMainWindow

메뉴·중앙 위젯이 있는 문서 창입니다. 인사 앱의 QWidget보다 메모장에 맞습니다.

RESULT PREVIEW

실행하면 이렇게 보여요

메모장 · PySide6 QMainWindow
QPlainTextEdit를 중앙에 두고 파일 메뉴를 붙입니다. 이 예제를 Linux에서 실행해 캡처한 화면입니다. OS·테마에 따라 외형은 달라집니다.

CODE WORKSPACE

코드를 바꾸는 실습실

실행 환경

main.py

실행 엔진은 처음 실행할 때 내려받습니다. 패키지 크기에 따라 최초 준비에 최대 3분이 걸릴 수 있으며 네트워크가 필요합니다. 실행은 최대 30초이며 중지 후 다시 실행할 수 있습니다.

실행할 예제를 선택하세요.

PRACTICE / RETRY / UNDERSTAND

이 주제 연습 문제 11

이 주제와 연결된 문제만 보여 줍니다. 단원 전체 문제는 단원 안내 페이지에서 이어서 풀 수 있습니다.

단원 전체 70문제로 →