tkinter에서 widget 위치 지정하는 방법

tkinter에서 위젯을 배치하고 정렬하는 것은 geometry manager로 알려진 배치 관리자들을 통해 수행됩니다. tkinter는 세 가지 주요 배치 관리자를 제공합니다:

  1. pack: 위젯을 상하 또는 좌우로 순차적으로 쌓는 방식으로 배치합니다.
  2. grid: 표(격자) 형태로 위젯을 배치하며, 행(row)과 열(column)을 지정하여 위치를 정할 수 있습니다.
  3. 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()를 함께 사용하면 오류가 발생합니다.
  • 배치 관리자는 각자의 장단점이 있으므로, 적절한 상황에 맞게 선택하여 사용해야 합니다.

댓글 쓰기

댓글 목록