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()를 함께 사용하면 오류가 발생합니다. - 배치 관리자는 각자의 장단점이 있으므로, 적절한 상황에 맞게 선택하여 사용해야 합니다.