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

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

GUI 라이브러리 비교 갤러리

같은 인사 앱을 여섯 가지 방식으로 비교하세요.

교과서 45–48쪽 + 보강예제 6개

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

중단원 01. GUI 프로그래밍 개요 · 42–48쪽
소단원 02. 파이썬 GUI · 45–46쪽

이 웹 주제의 연계 범위: 45–48쪽 + 보강

웹 학습 주제 02 / 10

GUI 라이브러리 비교 갤러리

같은 인사 앱을 여섯 가지 방식으로 비교하세요.

AT A GLANCE

같은 앱, 다른 GUI 도구

  1. 1공통 기능이름 받아 인사
  2. 2화면 도구 선택
  3. 3위젯과 이벤트 연결
  4. 4실제 PC에서 비교
도구화면 구성학습 경로
tkinter / ttkTk 위젯 / 테마 위젯교과서 기본
PySide6 / PyQt6Qt 위젯과 레이아웃동일 개념 확장
wxPythonOS 위젯 활용데스크톱 비교
Kivy자체 그리기터치 UI 비교

BEFORE THE CODE

코드 전에 알아 두기

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

같은 버튼, 다른 이름tk.Button · ttk.Button · QPushButton

역할은 클릭입니다. 붙이는 법(pack / addWidget)만 다릅니다. 먼저 hello-tk의 Button·pack·command를 보세요.

바인딩

다른 언어의 GUI 툴킷을 파이썬에서 쓰게 하는 연결입니다. PySide6·PyQt6가 Qt의 바인딩입니다.

ttk

tkinter의 테마 위젯입니다. 기능은 Label·Button과 같고 모양만 운영체제 테마를 따릅니다.

교과서의 tkinter, PyQt, wxPython, Kivy에 PySide6와 ttk를 보강했습니다. tkinter는 Tcl/Tk 연결이며 파이썬 배포에 흔히 포함됩니다. 다만 일부 Linux 환경은 python3-tk를 별도 설치해야 합니다. ttk는 Tk의 테마 위젯입니다.

PySide6와 PyQt6는 Qt 6를 파이썬에서 사용하는 서로 다른 바인딩입니다. 이 과정의 추가 실습은 Qt 공식 바인딩인 PySide6의 Qt Widgets를 사용합니다. 두 라이브러리의 외형은 같은 Qt 스타일을 쓰면 비슷하며 화면만으로 구분하기 어렵습니다.

wxPython은 wxWidgets 기반으로 운영체제의 위젯을 활용합니다. Kivy는 자체 그리기 방식으로 터치와 여러 플랫폼의 인터페이스를 구성합니다. 배포 대상·필요 위젯·학습 자료·환경 지원을 기준으로 선택하세요.

갤러리의 화면은 제공하는 코드를 실행한 캡처입니다. OS와 테마에 따라 외형은 달라집니다. PyQt와 PySide는 배포 조건이 다르므로 실제 배포 전 각 공식 라이선스 안내를 확인하는 습관을 갖습니다.

좀 더 알아보기: IDLE은 tkinter를 사용하는 실제 파이썬 프로그램입니다. IDLE의 메뉴·버튼·입력창이 어떤 위젯으로 구성될지 관찰하세요. 라이브러리를 선택한 이유는 기능과 사용자를 함께 근거로 적으세요.

위젯·배치·이벤트·메모장을 wxPython으로 다시 만드는 과정은 부록 주제에서 이어집니다. 본편 tkinter/PySide6 경로는 그대로입니다.

직접 해 보세요

  1. 같은 앱을 학교 실습용과 터치 키오스크용으로 만들 때 선택 근거를 비교하세요.
  2. 48쪽 확인학습: UI 정의, GUI 장점, NUI 설명, 라이브러리 특징을 점검하세요.

이 설명에 이어서 실습하기

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

인사 앱 · tkinter

BEFORE THE CODE

코드 전에 알아 두기

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

tk.Tkroot = tk.Tk()

빈 창을 만듭니다. 이 창이 Label·Entry·Button의 부모입니다.

title / geometryroot.title("제목") root.geometry("480x260")

창 제목과 처음 크기를 정합니다. 크기를 빼도 위젯을 붙이면 창이 맞춰집니다.

Labeltk.Label(parent, text=..., font=...)

글자를 보여 줍니다. 나중에 config(text=...)로 바꿀 수 있습니다.

Entryentry = tk.Entry(parent)

한 줄 입력을 받습니다. get()으로 읽고, delete(0, tk.END)로 지웁니다.

Buttontk.Button(parent, text=..., command=함수)

클릭하면 command에 넣은 함수를 실행합니다. command=함수()처럼 괄호를 붙이면 버튼을 만들 때 바로 실행됩니다.

pack위젯.pack(pady=8, fill="x")

위젯을 창에 붙입니다. 생성만 하고 pack을 빼면 화면에 보이지 않습니다.

mainlooproot.mainloop()

클릭·입력을 기다리는 이벤트 루프입니다. 이 줄 아래의 코드는 창을 닫을 때까지 실행되지 않습니다.

위젯

창 안의 부품입니다. Label·Entry·Button이 위젯입니다.

이벤트 루프

사용자의 클릭·입력을 순서대로 받아 처리하는 반복입니다. mainloop가 그 역할을 합니다.

HISTORY / VIDEO

더 알아보는 팁

역사 한 줄

Tk는 1991년 John Ousterhout가 Tcl에 붙인 GUI 툴킷입니다. 파이썬 표준 라이브러리의 tkinter는 이 Tk를 연결하므로, 많은 환경에서 별도 설치 없이 창과 버튼을 만들 수 있습니다.

RESULT PREVIEW

실행하면 이렇게 보여요

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

인사 앱 · tkinter + ttk

BEFORE THE CODE

코드 전에 알아 두기

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

ttkfrom tkinter import ttk ttk.Button(parent, text=..., command=...)

Tk의 테마 위젯입니다. Label·Entry·Button의 역할은 같고, 모양만 운영체제 테마를 따릅니다.

테마 위젯

역할은 tk.Label·tk.Button과 같고, 테두리·색만 운영체제 테마를 따릅니다. command·pack은 그대로입니다.

RESULT PREVIEW

실행하면 이렇게 보여요

ttk 인사 앱 실행 화면 · 이름 입력창과 인사 및 초기화 버튼
같은 인사 앱을 ttk 테마 위젯으로 실행한 화면입니다.

인사 앱 · 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·테마에 따라 외형은 달라집니다.

인사 앱 · PyQt6

BEFORE THE CODE

코드 전에 알아 두기

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

PyQt6from PyQt6.QtWidgets import QApplication, ...

위젯 이름과 호출은 PySide6와 같습니다. import 줄의 패키지 이름만 바꿉니다.

바꿔 볼 곳examples["hello-pyside"]의 import를 PyQt6로

setWindowTitle·clicked.connect·app.exec는 그대로입니다. 한 줄만 바꿔 같은 창이 열리는지 확인하세요.

PyQt6

Qt 6의 또 다른 파이썬 바인딩입니다. 위젯 이름은 PySide6와 같고, 배포 라이선스가 다릅니다.

RESULT PREVIEW

실행하면 이렇게 보여요

PyQt6 인사 앱 실행 화면 · 이름 입력창과 인사 및 초기화 버튼
같은 인사 앱을 PyQt6로 실행한 화면입니다. PySide6와 외형이 비슷할 수 있습니다.

인사 앱 · wxPython

BEFORE THE CODE

코드 전에 알아 두기

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

wx.Appapp = wx.App()

앱 객체입니다. 창보다 먼저 만듭니다.

wx.Framewindow = wx.Frame(None, title="제목", size=(480, 300))

제목 줄이 있는 창입니다. 위젯은 Panel 위에 올립니다.

BoxSizerlayout = wx.BoxSizer(wx.VERTICAL) layout.Add(위젯, 0, wx.ALL, 12)

위에서 아래로 붙입니다. pack() 대신 Sizer가 자리를 정합니다.

TextCtrlentry = wx.TextCtrl(panel) entry.GetValue() · entry.SetValue("")

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

Bindbutton.Bind(wx.EVT_BUTTON, greet)

클릭 사건에 함수를 맡깁니다. Bind(..., greet())처럼 괄호를 붙이면 지금 실행됩니다. greet는 event 인자를 받습니다.

MainLoopwindow.Show() app.MainLoop()

이벤트 루프입니다. Show 뒤에 호출합니다. tkinter mainloop / Qt exec에 대응합니다.

wxPython

wxWidgets의 파이썬 바인딩입니다. 운영체제의 버튼·입력창을 그대로 활용합니다.

event 인자

처리 함수의 첫 매개변수입니다. 쓰지 않아도 선언해야 TypeError가 나지 않습니다.

RESULT PREVIEW

실행하면 이렇게 보여요

wxPython 인사 앱 실행 화면 · 이름 입력창과 인사 및 초기화 버튼
같은 인사 앱을 wxPython으로 실행한 화면입니다. 운영체제 위젯을 활용합니다.

인사 앱 · Kivy

RESULT PREVIEW

실행하면 이렇게 보여요

Kivy 인사 앱 실행 화면 · 이름 입력창과 Greet 및 Reset 버튼
같은 인사 앱을 Kivy로 실행한 화면입니다. 기본 글꼴을 위해 영어 문구를 사용합니다.

CODE WORKSPACE

코드를 바꾸는 실습실

실행 환경

main.py

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

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

PRACTICE / RETRY / UNDERSTAND

이 주제 연습 문제 1

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

단원 전체 70문제로 →