Tkinter Pack

2024. 2. 21. 11:30GUI/tkinter

요약 : 이 튜토리얼에서는 Tkinter 팩 기하학 관리자와 이를 사용하여 창에 위젯을 정렬하는 방법에 대해 배웁니다.

Tkinter 팩 기하학 관리자 소개

Tkinter는 기하학 관리자를 사용하여 창에서 위젯을 구성합니다. Tkinter는 세 가지 기하학 관리자를 지원합니다:

  • pack
  • grid
  • place

팩 지오메트리 관리자는 위젯을 기본 창이나 프레임일 수 있는 컨테이너 위젯에 배치하기 전에 위젯을 블록으로 구성합니다 .

팩 지오메트리 관리자에는 위젯을 정렬하는 다양한 옵션이 있습니다.

  • Side
  • Expand
  • Fill
  • ipadx, ipady
  • padx, pady
  • Anchor

각 옵션을 살펴보기 전에 창의 좌표를 x와 y를 이해해야 합니다.

창의 왼쪽 상단이 좌표의 원점(0,0)입니다. x 좌표는 왼쪽에서 오른쪽으로 증가하고 y 좌표는 위에서 아래로 증가합니다.

Tkinter 팩 매개변수

팩 형상 관리자의 작동 방식을 설명하기 위해 간단한 프로그램을 만듭니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack()
label2.pack()
label3.pack()

root.mainloop()

이 프로그램에는 빨간색, 녹색, 파란색 배경색이 있는 세 가지 레이블이 있는 기본 창이 있습니다.

팩 지오메트리 관리자를 사용하려면 위젯의 pack()를 호출합니다. 기본적으로 팩 지오메트리 관리자는 위젯을 위에서 아래로 수직으로 한 방향으로 배치합니다.

 

Side

side 매개변수는 팩 레이아웃에서 위젯의 방향을 결정합니다.

side 매개변수에는 네 가지 옵션이 있습니다.

  • 'top': 위젯을 위에서 아래로 수직으로 정렬합니다.
  • 'bottom': 위젯을 아래에서 위로 수직으로 정렬합니다.
  • 'left': 위젯을 왼쪽에서 오른쪽으로 수평으로 정렬합니다.
  • 'right': 위젯을 오른쪽에서 왼쪽으로 수평으로 정렬합니다.

side는 위젯을 위에서 아래로 수직으로 배열하는 'top'이 기본값 입니다.

문자열 상수 외에도 Tkinter 모듈에서 제공하는 미리 정의된 상수를 사용할 수 있습니다:

  • tk.TOP
  • tk.BOTTOM
  • tk.LEFT
  • tk.RIGHT

Tkinter 모듈을 tk로 import 합니다.

다음 프로그램은 레이블을 위에서 아래로 수직으로 정렬하는 'top'을 측면에 명시적으로 설정합니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.TOP)
label2.pack(side=tk.TOP)
label3.pack(side=tk.TOP)

root.mainloop()

측면을 tk.BOTTOM로 변경하면, 팩은 라벨을 아래에서 위로 수직으로 정렬합니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.BOTTOM)
label2.pack(side=tk.BOTTOM)
label3.pack(side=tk.BOTTOM)

root.mainloop()

 

측면을 tk.LEFT로 변경하면, 팩은 레이블을 왼쪽에서 오른쪽으로 정렬합니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.LEFT)
label2.pack(side=tk.LEFT)
label3.pack(side=tk.LEFT)

root.mainloop()

Output :

 

측면을 tk.LEFT

 

로 변경하면, 팩은 레이블을 오른쪽에서 왼쪽으로 정렬합니다.

Output :

 

위젯 공간

Tkinter에는 두 종류의 공간이 있습니다:

  • 위젯이 차지할 수 있는 공간
  • 위젯이 차지할 공간

기본적으로 위젯은 콘텐츠를 표시하는 데 필요한 공간만 차지합니다. 그러나 위젯은 더 많은 공간을 차지할 수 있습니다 .

예를 들어 Label 위젯의 크기는 텍스트만큼만 됩니다. 배경색은 텍스트의 길이가 다르기 때문에 각 레이블의 너비가 다르다는 것을 나타냅니다.

확장하다

확장은 컨테이너에 할당된 추가 공간을 차지하기 위해 위젯을 확장해야 하는지 여부를 결정합니다.

확장을 True로 설정하면 위젯이 확장되고, False로 설정하면 확장되지 않습니다. 확장 매개변수의 기본값은 False입니다.

확장 매개변수는 측면 매개변수에 크게 의존합니다.

다음 표에서는 위젯 공간과 관련된 측면 매개변수와 확장 매개변수 간의 종속성을 보여줍니다.

Side확장하다
Top(또는 Bottom) 위젯은 컨테이너만큼 넓을 수 있으며 확장에 따라 위젯의 높이가 결정됩니다.
Left(또는 Right) 위젯은 컨테이너만큼 높을 수 있으며 확장에 따라 위젯의 너비가 결정됩니다.

다음 프로그램은 Label 위젯을 위에서 아래로 수직으로 배치하고 첫 번째 Label 위젯의 확장 매개변수를 True로 설정하고, 다른 두 Label 위젯을 False로 설정합니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.TOP, expand=True)
label2.pack(side=tk.TOP, expand=False)
label3.pack(side=tk.TOP, expand=False)

root.mainloop()

첫 번째 Label의 확장 매개변수를 true로 설정했기 때문에 전체 수직 공간을 차지하고 나머지 두 Label 위젯을 아래쪽으로 밀어냅니다.

 

다음 프로그램은 Label 위젯을 왼쪽에서 오른쪽으로 수평으로 배치하고 첫 번째 Label 위젯의 확장 매개변수를 True로 설정하고 다른 두 Label 위젯을 False로 설정합니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.LEFT, expand=True)
label2.pack(side=tk.LEFT, expand=False)
label3.pack(side=tk.LEFT, expand=False)

root.mainloop()

첫 번째 Label의 확장 매개변수를 true로 설정했기 때문에 이는 완전히 수평 공간을 차지하고 다른 두 개의 Label 위젯을 오른쪽으로 밀어냅니다.

 

세 개의 Label 위젯의 확장 매개변수를 True로 설정하면, 수평 공간도 나누게 됩니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.LEFT, expand=True)
label2.pack(side=tk.LEFT, expand=True)
label3.pack(side=tk.LEFT, expand=True)

root.mainloop()
 
 

Fill(채우다)

채우기는 위젯이 사용 가능한 공간을 차지할지 여부를 결정합니다. 'x', 'y', 'both' 및 'none' 값을 허용합니다. 기본적으로 채우기는 'none'입니다.

Fill효과
'none' 위젯은 추가 공간을 채우기 위해 확장되지 않습니다. 내용에 맞는 공간만 차지합니다.
'x' 위젯은 x축을 따라 추가 공간을 채우기 위해 수평으로 확장됩니다.
'y' 위젯은 Y축을 따라 추가 공간을 채우기 위해 수직으로 확장됩니다.
'both' 위젯은 수평 및 수직으로 확장되어 양방향으로 추가 공간을 채웁니다.

다음 프로그램은 채우기 매개변수의 작동 방식을 보여줍니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Fill',bg='blue', fg='white')
label4 = tk.Label(master=root, text='Demo',bg='purple', fg='white')

label1.pack(side=tk.TOP, expand=True, fill=tk.X)
label2.pack(side=tk.TOP, expand=True, fill=tk.Y)
label3.pack(side=tk.TOP, expand=True, fill=tk.NONE)
label4.pack(side=tk.TOP, expand=True, fill=tk.BOTH)


root.mainloop()

 

이 예에서는 Label 위젯을 위에서 아래로 수직으로 배열합니다. 모든 Label 위젯의 확장이 True로 설정됩니다.

  • 첫 번째 Label 위젯의 채우기 값은 tk.X로, x축을 따라 추가 공간을 채울 수 있습니다.
  • 두 번째 Label 위젯의 채우기 값은 tk.Y로, y축을 따라 추가 공간을 채울 수 있습니다.
  • 세 번째 Label 위젯의 채우기 값은 tk.NONE이며, 이는 추가 공간을 채우기 위해 확장되지 않음을 나타냅니다.
  • 네 번째 Label 위젯의 채우기 값은 tk.BOTH이므로 가로 및 세로 방향 모두에서 추가 공간을 차지할 수 있습니다.

내부 패딩: ipadx 및 ipad ipadx 및 ipady 매개변수는 위젯의 내부 패딩을 생성합니다.

  • ipadx : 왼쪽 및 오른쪽 패딩을 생성하거나 x축을 따라 패딩을 생성합니다.
  • ipady : 위쪽과 아래쪽 패딩을 생성하거나 y축을 따라 패딩을 생성합니다.

예를 들어, 다음 프로그램은 ipadx및 ipady 매개변수를 사용하여 각 Label 위젯의 내부 패딩을 설정합니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Pack',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack',bg='green', fg='white')
label3 = tk.Label(master=root, text='Pack',bg='blue', fg='white')
label4 = tk.Label(master=root, text='Pack',bg='purple', fg='white')

label1.pack(side=tk.LEFT)
label2.pack(side=tk.LEFT, ipadx=40)
label3.pack(side=tk.LEFT, ipady=40)
label4.pack(side=tk.LEFT, ipadx=80, ipady=80)

root.mainloop()

 

다음 프로그램은 padx를 사용하는 방법을 보여줍니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Pack',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack',bg='green', fg='white')
label3 = tk.Label(master=root, text='Pack',bg='blue', fg='white')
label4 = tk.Label(master=root, text='Pack',bg='purple', fg='white')

label1.pack(side=tk.LEFT, fill=tk.X, padx=10)
label2.pack(side=tk.LEFT, fill=tk.X, padx=20)
label3.pack(side=tk.LEFT, fill=tk.X ,padx=40)
label4.pack(side=tk.LEFT, fill=tk.X, padx=60)

root.mainloop()
 
 

 

 

 

Anchor

anchor 매개변수를 사용하면 위젯을 할당된 공간의 가장자리에 고정할 수 있습니다. 다음 값 중 하나를 허용합니다.

Sticky설명
'n' 북쪽 또는 상단 중앙
's' 남쪽 또는 하단 중앙
'e' 동쪽 또는 오른쪽 센터
'w' 서쪽 또는 왼쪽 중앙
'nw' 북서쪽 또는 왼쪽 상단
'ne' 북동쪽 또는 오른쪽 상단
'se' 남동쪽 또는 오른쪽 하단
'sw' 남서쪽 또는 왼쪽 하단
'center' 중앙

다음 그림은 앵커 옵션을 보여줍니다.

 

예를 들어 다음 프로그램은 E 및 W 앵커를 사용하는 위젯을 보여줍니다.

In [ ]:
import tkinter as tk

root = tk.Tk()
root.title('Pack Demo')
root.geometry("350x200")

# box 1
box1 = tk.Label(root, text="Box 1", bg="green", fg="white")
box1.pack(ipadx=20, ipady=20, anchor=tk.E,  expand=True)

# box 2
box2 = tk.Label(root, text="Box 2", bg="red", fg="white")
box2.pack(ipadx=20, ipady=20, anchor=tk.W, expand=True)


root.mainloop()

 

Tkinter 팩을 사용하여 로그인 양식 만들기

다음 예에서는 pack() 메서드를 사용하여 로그인 양식을 만듭니다.

In [ ]:
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title('Login')
root.geometry("350x220")


fields = {}

fields['username_label'] = ttk.Label(text='Username:')
fields['username'] = ttk.Entry()

fields['password_label'] = ttk.Label(text='Password:')
fields['password'] = ttk.Entry(show="*")


for field in fields.values():
    field.pack(anchor=tk.W, padx=10, pady=5, fill=tk.X)

ttk.Button(text='Login').pack(anchor=tk.W, padx=10, pady=5)

root.mainloop()

 

작동 방식.

먼저 위젯을 저장하기 위해 사전을 초기화합니다.

fields = {}

둘째, 라벨 및 항목 위젯을 만듭니다.

In [ ]:
fields['username_label'] = ttk.Label(text='Username:')
fields['username'] = ttk.Entry()

fields['password_label'] = ttk.Label(text='Password:')
fields['password'] = ttk.Entry(show="*")

셋째, 위젯을 반복하고 패키징합니다.

In [ ]:
for field in fields.values():
    field.pack(anchor=tk.W, padx=10, pady=5, fill=tk.X)

마지막으로 로그인 버튼을 추가합니다.

In [ ]:
ttk.Button(text='Login').pack(anchor=tk.W, padx=10, pady=5)

요약

  • Tkinter Pack Geometry 관리자를 사용하여 위젯을 하향식 또는 병렬 레이아웃으로 배열합니다.
  • Pack Geometry 관리자의 측면, 확장 및 채우기 옵션을 사용하여 위젯 정렬 방법을 제어합니다.

'GUI > tkinter' 카테고리의 다른 글

Tkinter Place  (0) 2024.02.23
Tkinter Grid  (0) 2024.02.23
Tkinter Entry  (1) 2024.02.20
Tkinter 위젯  (0) 2024.02.20
Tkinter 라벨  (1) 2024.02.18