tk.Button · ttk.Button · QPushButton역할은 클릭입니다. 붙이는 법(pack / addWidget)만 다릅니다. 먼저 hello-tk의 Button·pack·command를 보세요.
인공지능 파이썬 실무
Ⅱ. GUI 프로그래밍 · 주제 02 / 10
같은 인사 앱을 여섯 가지 방식으로 비교하세요.
대단원 Ⅱ. GUI 프로그래밍 교과서 40–59쪽
중단원 01. GUI 프로그래밍 개요 · 42–48쪽
소단원 02. 파이썬 GUI · 45–46쪽
이 웹 주제의 연계 범위: 45–48쪽 + 보강
웹 학습 주제 02 / 10
같은 인사 앱을 여섯 가지 방식으로 비교하세요.
| 도구 | 화면 구성 | 학습 경로 |
|---|---|---|
| tkinter / ttk | Tk 위젯 / 테마 위젯 | 교과서 기본 |
| PySide6 / PyQt6 | Qt 위젯과 레이아웃 | 동일 개념 확장 |
| wxPython | OS 위젯 활용 | 데스크톱 비교 |
| Kivy | 자체 그리기 | 터치 UI 비교 |
BEFORE THE CODE
새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.
tk.Button · ttk.Button · QPushButton역할은 클릭입니다. 붙이는 법(pack / addWidget)만 다릅니다. 먼저 hello-tk의 Button·pack·command를 보세요.
다른 언어의 GUI 툴킷을 파이썬에서 쓰게 하는 연결입니다. PySide6·PyQt6가 Qt의 바인딩입니다.
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 경로는 그대로입니다.
예제를 선택하면 바로 아래에서 코드를 수정하고 실행할 수 있습니다. 작성한 코드는 예제별로 저장됩니다.
BEFORE THE CODE
새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.
root = tk.Tk()빈 창을 만듭니다. 이 창이 Label·Entry·Button의 부모입니다.
root.title("제목")
root.geometry("480x260")창 제목과 처음 크기를 정합니다. 크기를 빼도 위젯을 붙이면 창이 맞춰집니다.
tk.Label(parent, text=..., font=...)글자를 보여 줍니다. 나중에 config(text=...)로 바꿀 수 있습니다.
entry = tk.Entry(parent)한 줄 입력을 받습니다. get()으로 읽고, delete(0, tk.END)로 지웁니다.
tk.Button(parent, text=..., command=함수)클릭하면 command에 넣은 함수를 실행합니다. command=함수()처럼 괄호를 붙이면 버튼을 만들 때 바로 실행됩니다.
위젯.pack(pady=8, fill="x")위젯을 창에 붙입니다. 생성만 하고 pack을 빼면 화면에 보이지 않습니다.
root.mainloop()클릭·입력을 기다리는 이벤트 루프입니다. 이 줄 아래의 코드는 창을 닫을 때까지 실행되지 않습니다.
창 안의 부품입니다. Label·Entry·Button이 위젯입니다.
사용자의 클릭·입력을 순서대로 받아 처리하는 반복입니다. mainloop가 그 역할을 합니다.
HISTORY / VIDEO
Tk는 1991년 John Ousterhout가 Tcl에 붙인 GUI 툴킷입니다. 파이썬 표준 라이브러리의 tkinter는 이 Tk를 연결하므로, 많은 환경에서 별도 설치 없이 창과 버튼을 만들 수 있습니다.
Tkinter Course — Create Graphic User Interfaces in Python (freeCodeCamp) ↗
영어 공개 강의입니다. 처음에는 창·Label·Button·pack만 따라 보고, 나머지는 필요할 때 이어서 보세요. 학교 네트워크·연령 정책을 확인하세요.
RESULT PREVIEW
BEFORE THE CODE
새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.
from tkinter import ttk
ttk.Button(parent, text=..., command=...)Tk의 테마 위젯입니다. Label·Entry·Button의 역할은 같고, 모양만 운영체제 테마를 따릅니다.
역할은 tk.Label·tk.Button과 같고, 테두리·색만 운영체제 테마를 따릅니다. command·pack은 그대로입니다.
RESULT PREVIEW
BEFORE THE CODE
새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.
app = QApplication(sys.argv)Qt 앱 객체입니다. 창보다 먼저 만듭니다. tkinter의 Tk()가 창과 앱을 겸하는 것과 다릅니다.
window = QWidget()
window.setWindowTitle("제목")빈 창입니다. resize(가로, 세로)로 처음 크기를 정합니다.
layout = QVBoxLayout(window)
layout.addWidget(위젯)위젯을 위에서 아래로 붙입니다. pack() 대신 레이아웃이 자리를 정합니다.
entry = QLineEdit()
entry.text() · entry.clear()한 줄 입력입니다. tkinter Entry의 get/delete에 대응합니다.
button.clicked.connect(greet)클릭 시그널에 함수를 맡깁니다. connect(greet())처럼 괄호를 붙이면 지금 실행됩니다.
sys.exit(app.exec())이벤트 루프입니다. tkinter의 mainloop에 대응합니다. show() 뒤에 호출합니다.
위젯이 “클릭됐다”, “글자가 바뀌었다”처럼 알리는 사건입니다. connect로 함수를 연결합니다.
Qt의 공식 파이썬 바인딩입니다. 이 과정의 Qt 실습은 Qt Widgets를 사용합니다.
RESULT PREVIEW
BEFORE THE CODE
새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.
from PyQt6.QtWidgets import QApplication, ...위젯 이름과 호출은 PySide6와 같습니다. import 줄의 패키지 이름만 바꿉니다.
examples["hello-pyside"]의 import를 PyQt6로setWindowTitle·clicked.connect·app.exec는 그대로입니다. 한 줄만 바꿔 같은 창이 열리는지 확인하세요.
Qt 6의 또 다른 파이썬 바인딩입니다. 위젯 이름은 PySide6와 같고, 배포 라이선스가 다릅니다.
RESULT PREVIEW
BEFORE THE CODE
새 이름·속성이 코드에 나오기 전에 짧게 봅니다. 외우기보다 역할을 먼저 구별하세요.
app = wx.App()앱 객체입니다. 창보다 먼저 만듭니다.
window = wx.Frame(None, title="제목", size=(480, 300))제목 줄이 있는 창입니다. 위젯은 Panel 위에 올립니다.
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(위젯, 0, wx.ALL, 12)위에서 아래로 붙입니다. pack() 대신 Sizer가 자리를 정합니다.
entry = wx.TextCtrl(panel)
entry.GetValue() · entry.SetValue("")한 줄 입력입니다. tkinter Entry의 get/delete에 대응합니다.
button.Bind(wx.EVT_BUTTON, greet)클릭 사건에 함수를 맡깁니다. Bind(..., greet())처럼 괄호를 붙이면 지금 실행됩니다. greet는 event 인자를 받습니다.
window.Show()
app.MainLoop()이벤트 루프입니다. Show 뒤에 호출합니다. tkinter mainloop / Qt exec에 대응합니다.
wxWidgets의 파이썬 바인딩입니다. 운영체제의 버튼·입력창을 그대로 활용합니다.
처리 함수의 첫 매개변수입니다. 쓰지 않아도 선언해야 TypeError가 나지 않습니다.
RESULT PREVIEW
RESULT PREVIEW
CODE WORKSPACE
실행 엔진은 처음 실행할 때 내려받습니다. 패키지 크기에 따라 최초 준비에 최대 3분이 걸릴 수 있으며 네트워크가 필요합니다. 실행은 최대 30초이며 중지 후 다시 실행할 수 있습니다.
실행할 예제를 선택하세요.
SAME TASK, DIFFERENT TOOLKITS
모두 이름 입력·인사·초기화 기능을 갖춘 앱입니다. Linux 가상 디스플레이에서 제공 소스를 실행해 캡처했습니다. OS·테마에 따라 외형은 달라집니다. Kivy 예제는 기본 글꼴에서도 보이도록 영어 문구를 사용합니다.

교과서 40–59쪽 · 2개 중단원
기본 위젯 · 간단한 도구
Tcl/Tk 8.6
교과서 40–59쪽 · 2개 중단원
테마 위젯 · tkinter 확장
Tcl/Tk 8.6
교과서 40–59쪽 · 2개 중단원
Qt 공식 바인딩 · Qt Widgets
6.11.2 / Qt 6.11.2
교과서 40–59쪽 · 2개 중단원
Qt 바인딩 · 풍부한 위젯
6.11.0 / Qt 6.11.2
교과서 40–59쪽 · 2개 중단원
OS 위젯 · 데스크톱 도구
4.2.3 / wxWidgets 3.2
교과서 40–59쪽 · 2개 중단원
자체 렌더링 · 터치 UI
2.3.1위젯 도감·레이아웃·메모장·생활 도우미까지 같은 개념을 대응하여 볼 수 있습니다. 실제 수정과 파일 다운로드는 실습실에서 진행하세요.
PRACTICE / RETRY / UNDERSTAND
이 주제와 연결된 문제만 보여 줍니다. 단원 전체 문제는 단원 안내 페이지에서 이어서 풀 수 있습니다.