
이 강의는 Tkinter GUI 강의 19강입니다
18강에서는
LabelFrame 위젯을 사용해
관련 위젯을 그룹으로 묶는 방법을 배웠습니다.
이번 강의에서는
레이아웃을 다룰 때
반드시 이해해야 하는 개념인
위젯 크기 고정과 자동 확장을 다룹니다.
이번 강의의 목표는 분명합니다.
창 크기가 변할 때
왜 어떤 위젯은 늘어나고, 어떤 위젯은 그대로인지
그 원리를 이해하는 것입니다.
창 크기를 바꾸면 왜 UI가 이상해질까
Tkinter 프로그램을 만들다 보면
이런 경험을 하게 됩니다.
- 창을 키웠는데 위젯은 그대로다
- 한쪽으로 몰려 있다
- 예상과 다르게 늘어난다
이 문제는
레이아웃 옵션을
제대로 이해하지 못해서 발생합니다.
위젯은 기본적으로 크기가 고정되어 있다
Tkinter에서
위젯은 기본적으로
자신에게 필요한 최소 크기만 차지합니다.
즉,
창이 커져도
아무 옵션을 주지 않으면
위젯은 스스로 늘어나지 않습니다.
이를 직접 확인해 보겠습니다.
기본 상태 확인 예제
import tkinter as tk
window = tk.Tk()
window.geometry("300x200")
tk.Button(window, text="버튼").pack()
window.mainloop()
창을 크게 만들어도
버튼 크기는
변하지 않습니다.
pack의 fill 옵션 이해하기
위젯이
부모 영역을 채우게 하려면
fill 옵션을 사용해야 합니다.
tk.Button(window, text="버튼").pack(fill="x")
- fill="x" : 가로 방향으로 채움
- fill="y" : 세로 방향으로 채움
- fill="both" : 가로 + 세로 모두 채움
fill 옵션 예제
import tkinter as tk
window = tk.Tk()
window.geometry("300x200")
tk.Button(window, text="가로 채우기").pack(fill="x")
tk.Button(window, text="모두 채우기").pack(fill="both")
window.mainloop()
이제
버튼이
부모 영역을 따라 늘어납니다.
expand 옵션의 역할
expand 옵션은
남는 공간을 위젯이 차지할지 여부를 결정합니다.
tk.Button(window, text="확장").pack(expand=True)
expand가 없으면
위젯은
자신의 영역만 차지합니다.
fill과 expand는 함께 쓰는 경우가 많다
실제로는
fill과 expand를
함께 사용하는 경우가 많습니다.
tk.Button(window, text="확장 버튼").pack(
fill="both",
expand=True
)
이 조합이
자동 확장의 기본 패턴입니다.
grid에서도 자동 확장은 따로 설정해야 한다
grid 레이아웃에서는
fill이나 expand 대신
다른 방식을 사용합니다.
바로
sticky 옵션입니다.
grid의 sticky 옵션
tk.Entry(frame).grid(row=0, column=0, sticky="ew")
- n : 위
- s : 아래
- e : 오른쪽
- w : 왼쪽
ew는
좌우로 늘어난다는 의미입니다.
grid 자동 확장 예제
import tkinter as tk
window = tk.Tk()
window.geometry("300x200")
frame = tk.Frame(window)
frame.pack(fill="both", expand=True)
frame.columnconfigure(1, weight=1)
tk.Label(frame, text="이름").grid(row=0, column=0)
tk.Entry(frame).grid(row=0, column=1, sticky="ew")
window.mainloop()
이제
Entry 위젯이
창 크기에 맞게
자동으로 늘어납니다.

grid에서는 weight 설정이 핵심이다
grid에서
자동 확장을 제대로 하려면
rowconfigure, columnconfigure를
반드시 이해해야 합니다.
frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)
weight는
“남는 공간을 얼마나 나눌지”를
결정합니다.
place는 기본적으로 자동 확장이 없다
place 레이아웃은
좌표 기반이기 때문에
자동 확장이 기본적으로 없습니다.
tk.Label(window, text="고정").place(x=50, y=50)
창 크기가 바뀌어도
위치는 그대로 유지됩니다.
자동 확장을 설계하는 사고 방식
중요한 것은
옵션을 외우는 것이 아니라
구조를 먼저 생각하는 것입니다.
- 어떤 영역이 늘어나야 하는가
- 어떤 위젯은 고정되어야 하는가
- 사용자가 창 크기를 바꿀 가능성이 있는가
이 질문에 답하면
레이아웃 선택과 옵션이
자연스럽게 정해집니다.
이번 강의 핵심 정리
이번 강의에서 꼭 기억해야 할 내용입니다.
- 위젯은 기본적으로 크기가 고정된다
- pack에서는 fill과 expand로 확장 제어
- grid에서는 sticky와 weight가 핵심
- 자동 확장은 의도적으로 설계해야 한다
다음 강의 예고
다음 강의에서는
fill과 expand 옵션을 더 깊게 파고들어
실전에서 자주 쓰는 패턴을 정리합니다.
이제부터는
“왜 이렇게 배치되는지”가
눈에 보이기 시작할 겁니다.
'⚙️ Python > 🪟 Tkinter 기초' 카테고리의 다른 글
| [Tkinter] 21강 Checkbutton 위젯으로 선택 입력 받기 (0) | 2026.01.31 |
|---|---|
| [Tkinter] 20강 fill과 expand 옵션 완벽 이해하기 (0) | 2026.01.30 |
| [Tkinter] 18강 LabelFrame 위젯으로 그룹 UI 만들기 (0) | 2026.01.29 |
| [Tkinter] 17강 Frame 위젯으로 화면 영역 나누기 (0) | 2026.01.29 |
| [Tkinter] 16강 pack vs grid vs place 레이아웃 완전 비교 (0) | 2026.01.28 |