tkinter에서 widget 위치 지정하는 방법
tkinter
에서 위젯을 배치하고 정렬하는 것은 geometry manager로 알려진 배치 관리자들을 통해 수행됩니다. tkinter
는 세 가지 주요 배치 관리자를 제공합니다:
pack
: 위젯을 상하 또는 좌우로 순차적으로 쌓는 방식으로 배치합니다.grid
: 표(격자) 형태로 위젯을 배치하며, 행(row)과 열(column)을 지정하여 위치를 정할 수 있습니다.place
: 위젯을 절대 위치나 상대 위치로 지정하여 배치합니다.
1. pack()
매니저
pack()
매니저는 위젯을 상하 또는 좌우로 순차적으로 쌓는 방식으로 배치합니다. 가장 간단한 배치 방식이지만, 복잡한 레이아웃을 만들기는 어렵습니다.
옵션
side
: 위젯을 배치할 방향을 지정합니다. ('top'
,'bottom'
,'left'
,'right'
)fill
: 위젯이 가로('x'
), 세로('y'
), 또는 둘 다('both'
)로 확장되는지를 지정합니다.expand
: 공간이 남을 때 위젯이 확장될지 여부를 지정합니다. (True
또는False
)padx
,pady
: 위젯의 내부 여백을 가로(padx
), 세로(pady
)로 지정합니다.
예제
import tkinter as tk
root = tk.Tk()
button1 = tk.Button(root, text="Top")
button1.pack(side='top', padx=10, pady=10)
button2 = tk.Button(root, text="Bottom")
button2.pack(side='bottom', fill='x')
button3 = tk.Button(root, text="Left")
button3.pack(side='left', fill='y')
button4 = tk.Button(root, text="Right")
button4.pack(side='right', expand=True)
root.mainloop()
2. grid()
매니저
grid()
매니저는 위젯을 행(row
)과 열(column
)을 지정하여 표 형태로 배치합니다. 복잡한 레이아웃을 만들기 편리하며, 각 셀의 크기와 위젯 간의 간격을 제어할 수 있습니다.
옵션
row
: 위젯을 배치할 행 번호를 지정합니다.column
: 위젯을 배치할 열 번호를 지정합니다.rowspan
,columnspan
: 위젯이 몇 개의 행이나 열을 차지할지 지정합니다.sticky
: 위젯을 셀 내에서 정렬할 방향을 지정합니다. ('n'
,'e'
,'s'
,'w'
,'ne'
,'ns'
,'ew'
,'nsew'
등)padx
,pady
: 위젯의 내부 여백을 가로(padx
), 세로(pady
)로 지정합니다.
예제
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="Row 0, Column 0")
label1.grid(row=0, column=0, padx=5, pady=5)
label2 = tk.Label(root, text="Row 0, Column 1")
label2.grid(row=0, column=1, padx=5, pady=5)
label3 = tk.Label(root, text="Row 1, Column 0", bg="yellow")
label3.grid(row=1, column=0, columnspan=2, sticky='ew', padx=5, pady=5)
root.mainloop()
3. place()
매니저
place()
매니저는 위젯의 크기와 위치를 절대 좌표 또는 상대 좌표를 사용하여 직접 지정합니다. 가장 유연하지만, 모든 위치와 크기를 수동으로 설정해야 하므로 배치가 복잡해질 수 있습니다.
옵션
x
,y
: 위젯의 왼쪽 위 모서리의 좌표를 지정합니다.relx
,rely
: 부모 위젯의 크기에 대한 상대적인 위치를 지정합니다. 값은0.0
~1.0
사이의 부동소수점입니다.width
,height
: 위젯의 고정 크기를 지정합니다.relwidth
,relheight
: 부모 위젯의 크기에 대한 위젯의 상대적인 크기를 지정합니다.
예제
import tkinter as tk
root = tk.Tk()
root.geometry('300x200')
label1 = tk.Label(root, text="Absolute Position")
label1.place(x=50, y=50)
label2 = tk.Label(root, text="Relative Position")
label2.place(relx=0.5, rely=0.5, anchor='center')
root.mainloop()
4. 배치 관리자 비교
매니저 | 특징 | 사용 시기 |
---|---|---|
pack | 위젯을 순차적으로 쌓아 배치합니다. | 간단하고 위젯이 적을 때 적합합니다. |
grid | 위젯을 표 형태로 배치합니다. | 복잡한 레이아웃을 쉽게 구성할 때 적합합니다. |
place | 위젯을 절대 또는 상대 좌표로 배치합니다. | 정확한 위치 제어가 필요할 때 적합합니다. |
5. 배치 관리자 사용 시 주의사항
- 한 위젯에 여러 배치 관리자를 동시에 사용할 수 없습니다. 예를 들어, 하나의 위젯에
pack()
과grid()
를 함께 사용하면 오류가 발생합니다. - 배치 관리자는 각자의 장단점이 있으므로, 적절한 상황에 맞게 선택하여 사용해야 합니다.