Tkinter에서 프레임(frame) 안에 위젯을 배치하면, 때때로 프레임의 크기가 위젯의 크기에 맞춰 자동으로 조정되는 경우가 있습니다. 프레임의 크기를 일정하게 유지하려면 위젯이 프레임 크기를 변경하지 못하도록 설정해야 합니다.
크기 고정을 위해 사용할 수 있는 대표적인 세 가지 방법은 다음과 같습니다.
- pack_propagate(True/False) : 불리언(Boolean) 값을 받는 이 메서드를 False로 설정하면, 내부 위젯이 프레임(또는 부모 컨테이너)의 크기를 강제로 조정하는 것을 차단합니다.
- resizable(x, y) : 창 자체의 크기가 사용자에 의해 변경되지 않도록 합니다. x와 y에 각각 0(False)을 넣으면 가로·세로 모두 고정됩니다.
- pack(fill, expand) : fill과 expand 옵션을 활용하면 geometry()로 지정한 창 크기에 맞게 위젯이 배치되며, 창이 정의된 크기를 유지하도록 도와줍니다.
즉, 이러한 설정을 적용하면 Tkinter 프레임 내부의 모든 위젯이 지정된 레이아웃에 반응형으로 배치되면서도, 프레임과 창의 전체 크기는 고정 상태로 유지됩니다.
예제 코드
from tkinter import *
win = Tk()
win.geometry("700x300")
# 창 크기 변경 허용하지 않기
win.resizable(0, 0)
label = Label(win, text="옵션을 선택하세요", font=('Times New Roman', 12))
label.pack_propagate(0)
label.pack(fill="both", expand=1)
def quit():
win.destroy()
# 버튼 두 개 생성
b1 = Button(win, text="계속")
b1.pack_propagate(0)
b1.pack(fill="both", expand=1)
b2 = Button(win, command=quit, text="종료")
b2.pack_propagate(0)
b2.pack(fill="both", expand=1)
win.mainloop()실행 결과
위 코드를 실행하면 창이 지정된 크기(700x300)로 고정되며, 사용자가 마우스로 창 테두리를 드래그해도 크기가 변경되지 않습니다. 또한 pack_propagate(0) 덕분에 레이블과 버튼 등 내부 위젯이 부모 컨테이너의 크기를 임의로 바꾸지 못하고, fill="both"와 expand=1 옵션에 따라 창 전체 영역에 균등하게 배치됩니다.
