Chapter 2: Tkinter UI 요소 완전 정복¶
👋 GUI 프로그램의 세계로!¶
안녕하세요! Chapter 1에서 파이썬 기초를 배웠으니, 이제 진짜 재미있는 부분을 시작해봅시다!
지금까지는 검은 화면에 글자만 나오는 프로그램을 만들었는데, 이번에는 버튼, 입력창, 메뉴가 있는 진짜 프로그램을 만들어보겠습니다.
🎯 이번 챕터에서 배울 것들¶
Tkinter를 선택하는 이유:
- ✅ 파이썬에 기본으로 포함되어 있음 (별도 설치 불필요)
- ✅ 배우기 쉬움 (초보자 친화적)
- ✅ 윈도우, 맥, 리눅스 모두에서 동작
- ✅ KRenamer 같은 데스크톱 앱에 완벽
학습할 UI 요소들:
- 🖼️ 기본 구조: 창(Window)과 기본 설정들
- 📝 텍스트 요소: Label, Entry, Text
- 🔘 버튼과 체크박스: Button, Checkbutton, Radiobutton
- 📋 목록과 선택: Listbox, Combobox
- 🖼️ 레이아웃: Frame, 배치 관리자들
- 🎨 고급 요소: Canvas, Menu, Scrollbar
📚 1. 기본 구조 - 모든 GUI의 출발점¶
첫 번째 창 만들어보기¶
src/chapter2/01_basic_window.py | |
---|---|
위 코드를 실행하면 간단한 GUI 창이 나타납니다. 제목 표시줄과 크기가 설정된 기본 창의 모습입니다.
💡 tkinter 기본 구조 이해하기
모든 tkinter 프로그램의 필수 3단계:
import tkinter as tk
→ tkinter 라이브러리 가져오기root = tk.Tk()
→ 메인 창 만들기root.mainloop()
→ 창 보여주고 사용자 입력 기다리기
창 설정 옵션들¶
📝 2. 텍스트 요소들 - 정보를 보여주고 받기¶
Label - 텍스트와 이미지 표시¶
Label 위젯의 다양한 스타일링 옵션들을 보여주는 예제입니다. 기본 라벨, 스타일 적용된 라벨, 여러 줄 라벨, 그리고 동적으로 변경되는 라벨을 확인할 수 있습니다.
Entry - 한 줄 텍스트 입력¶
Entry 위젯은 사용자로부터 한 줄의 텍스트를 입력받을 때 사용합니다. 단계별로 살펴보겠습니다.
🔹 1단계: 기본 Entry 만들기¶
🔹 2단계: 다양한 Entry 스타일¶
🔹 3단계: 입력값 검증과 처리¶
💡 Entry 위젯 핵심 포인트
.get()
: Entry에서 텍스트 가져오기.insert(position, text)
: 특정 위치에 텍스트 삽입.delete(start, end)
: 특정 범위의 텍스트 삭제show="*"
: 비밀번호처럼 문자를 숨김 처리state="readonly"
: 읽기 전용으로 설정
Text - 여러 줄 텍스트 입력/표시¶
Text 위젯은 Entry와 달리 여러 줄의 텍스트를 다룰 때 사용합니다. 단계별로 알아보겠습니다.
🔹 1단계: 기본 Text 위젯¶
🔹 2단계: 스크롤이 있는 Text¶
🔹 3단계: Text 조작 기능들¶
💡 Text 위젯 핵심 포인트
- Text vs Entry: Entry는 한 줄, Text는 여러 줄
- 위치 표시:
"1.0"
= 1번째 줄, 0번째 문자 (첫 번째 위치) tk.END
: 텍스트의 마지막 위치wrap=tk.WORD
: 단어 단위로 줄바꿈 (긴 줄을 자동으로 감쌈)- ScrolledText: 스크롤바가 자동으로 추가된 Text 위젯
🔘 3. 버튼과 선택 요소들¶
Button - 클릭 이벤트 처리¶
Button 위젯의 다양한 기능들을 보여주는 예제입니다. 기본 버튼, 색상이 적용된 버튼들, 그리고 메시지박스와 연동된 특별한 기능 버튼들을 확인할 수 있습니다.
Checkbutton과 Radiobutton - 선택 옵션¶
Checkbutton과 Radiobutton의 차이점을 보여주는 예제입니다. 체크박스는 여러 개를 동시에 선택할 수 있고, 라디오버튼은 하나만 선택할 수 있습니다. 선택 결과를 처리하는 방법도 함께 보여줍니다.
📋 4. 목록과 선택 요소들¶
Listbox - 목록 선택¶
Listbox는 여러 항목 중에서 하나 또는 여러 개를 선택할 수 있는 목록을 만들 때 사용합니다.
🔹 1단계: 기본 Listbox¶
🔹 2단계: 다중 선택 Listbox¶
🔹 3단계: Listbox 항목 추가/삭제¶
💡 Listbox 핵심 포인트
.curselection()
: 선택된 항목의 인덱스 반환 (튜플 형태).get(index)
: 특정 인덱스의 항목 텍스트 가져오기.insert(position, text)
: 항목 추가 (tk.END
로 마지막에 추가).delete(index)
: 항목 삭제 (인덱스 범위도 가능)selectmode=tk.MULTIPLE
: 다중 선택 모드.size()
: 총 항목 개수 확인
Combobox - 드롭다운 선택¶
🖼️ 5. 레이아웃과 구조 요소들¶
Frame - 위젯 그룹화¶
레이아웃 매니저 심화¶
src/chapter2/11_advanced_layout.py | |
---|---|
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
|
🎨 6. 고급 위젯들¶
Canvas - 그림 그리기¶
Canvas는 그림을 그리거나 도형을 표시할 수 있는 위젯입니다. 게임, 차트, 그래픽 도구 등을 만들 때 사용됩니다.
🔹 1단계: 기본 도형 그리기¶
🔹 2단계: 마우스로 그리기¶
🔹 3단계: 간단한 그래프 그리기¶
src/chapter2/12c_canvas_chart.py | |
---|---|
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
|
💡 Canvas 핵심 포인트
.create_rectangle(x1, y1, x2, y2)
: 직사각형 그리기.create_oval(x1, y1, x2, y2)
: 원/타원 그리기.create_line(x1, y1, x2, y2)
: 직선 그리기.create_polygon(points)
: 다각형 그리기 (points는 [x1,y1,x2,y2,...] 형태).create_text(x, y, text="...")
: 텍스트 표시.delete("all")
: 모든 그림 지우기- 마우스 이벤트:
<Button-1>
,<B1-Motion>
,<ButtonRelease-1>
- 색상과 스타일:
fill
,outline
,width
옵션으로 꾸미기
Menu - 메뉴바¶
대부분의 GUI 응용프로그램에는 맨 위에 메뉴바가 있습니다. 파일, 편집, 보기, 도움말 등의 메뉴를 만들어 보겠습니다.
🔹 1단계: 기본 메뉴 만들기¶
🔹 2단계: 텍스트 에디터 메뉴¶
src/chapter2/13b_text_editor_menu.py | |
---|---|
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
|
🔹 3단계: 고급 메뉴 (서브메뉴, 체크표시)¶
src/chapter2/13c_advanced_menu.py | |
---|---|
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
|
💡 Menu 핵심 포인트
tk.Menu(parent, tearoff=0)
: 메뉴 생성 (tearoff=0으로 떼어낼 수 없게).add_cascade(label, menu)
: 상위 메뉴에 하위 메뉴 추가.add_command(label, command)
: 일반 메뉴 항목 추가.add_checkbutton(label, variable, command)
: 체크박스 메뉴 항목.add_radiobutton(label, variable, value)
: 라디오버튼 메뉴 항목.add_separator()
: 구분선 추가accelerator="Ctrl+N"
: 단축키 표시 (실제 기능은 bind로 구현)root.config(menu=menubar)
: 루트 윈도우에 메뉴바 연결
🧪 실습 과제¶
🌟 기본 도전과제¶
1. 개인 정보 입력 폼 만들기¶
- Entry, Combobox, Checkbutton을 사용
- 이름, 나이, 성별, 취미 입력
- 입력 검증 및 결과 표시
2. 간단한 계산기¶
- Button으로 숫자와 연산자 배치
- Entry로 결과 표시
- 기본 사칙연산 구현
3. 색상 팔레트¶
- Canvas에 색상 샘플 표시
- Button으로 색상 선택
- 선택된 색상으로 배경색 변경
🚀 고급 도전과제¶
4. 미니 그림판¶
- Canvas에 자유 그리기
- 색상 선택, 붓 크기 조절
- 저장/불러오기 기능
5. 할 일 관리자¶
- Listbox로 할 일 목록 표시
- Entry로 새 할 일 추가
- 완료/삭제 기능 구현
🎯 Chapter 2 정리¶
✅ 배운 UI 요소들¶
기본 구조:
- Window 설정 (제목, 크기, 위치)
- 이벤트 루프 (
mainloop()
)
텍스트 요소:
- Label (정적 텍스트 표시)
- Entry (한 줄 입력)
- Text (여러 줄 입력/표시)
버튼과 선택:
- Button (클릭 이벤트)
- Checkbutton (다중 선택)
- Radiobutton (단일 선택)
목록과 선택:
- Listbox (목록 선택)
- Combobox (드롭다운)
레이아웃:
- Frame (그룹화)
- pack, grid, place (배치 관리자)
고급 요소:
- Canvas (그리기)
- Menu (메뉴바)
- Scrollbar (스크롤)
🌟 핵심 개념¶
이벤트 기반 프로그래밍:
def event_handler():
# 사용자 액션에 반응하는 코드
pass
button = tk.Button(root, text="클릭", command=event_handler)
위젯 속성 설정:
동적 내용 업데이트:
🎉 Chapter 2 완주 축하드려요!
Tkinter의 모든 핵심 UI 요소들을 성공적으로 마스터했습니다!
이제 할 수 있는 것들:
- ✅ 모든 종류의 GUI 위젯 사용하기
- ✅ 복잡한 레이아웃 구성하기
- ✅ 사용자 입력 처리하고 검증하기
- ✅ 이벤트 기반 프로그래밍하기
- ✅ 실용적인 데스크톱 애플리케이션 설계하기
🚀 다음 단계 준비하기
Chapter 3에서는:
- Chapter 2에서 배운 모든 요소들을 조합
- 실제 KRenamer 애플리케이션 구조 만들기
- 체계적인 클래스 설계와 이벤트 처리
- 실용적인 파일 관리 GUI 완성
이제 진짜 KRenamer를 만들어봅시다!