윈도우 프로그램 위젯 그룹핑

강의노트 LabelFrame

강의노트 • 조회수 166 • 댓글 0 • 작성 11개월 전 • 수정 1개월 전  
  • LabelFrame
  • 라벨프레임

LabelFrame

LabelFrame은 테두리와 제목이 있는 그룹 박스를 만드는 위젯으로 여러 위젯을 관련된 기능별로 묶어서 시각적으로 정리할 때 사용한다.

프레임의 크기는 프레임 안의 위젯들의 크기와 레이아웃에 따라 결정되지만 사용자가 지정할 수 도있다.

기본 구조

import tkinter as tk
from tkinter import ttk

# LabelFrame 생성
frame = ttk.LabelFrame(root, **options)

옵션들

열 1 열 2
text 라벨프레임의 제목을 지정한다.
labelanchor 제목의 위치를 지정한다. (n, ne, e, se, s, sw, w, nw, center)
padding 프레임과 프레임 안의 위젯들 사이의 너비를 설정한다.
style 위젯의 스타일을 설정한다.
style 사용예

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("LabelFrame 스타일 예제")

style = ttk.Style() #1
style.configure("Custom.TLabelframe", background="lightyellow", borderwidth=5, relief="solid") #2

lf = ttk.LabelFrame(root, text="스타일 적용 그룹", padding=(5,20), style="Custom.TLabelframe") #3
lf.pack(padx=20, pady=20)

ttk.Label(lf, text="내용 1").pack(anchor="w")
ttk.Label(lf, text="내용 2").pack(anchor="w")

root.mainloop()
  1. style을 만들기 위해서는 ttk의 Style()을 호출한다
  2. style의 configure를 통해 원하는 스타일로 바꿔준다.
    • "Custom.TLabelFrame"은 기본 스타일은 "TLabelFrame"이다. 이를 원하는 형태의 스타일로 바꿀때 이름(Custom)으로 바꿔주는 것을 의미한다.
    • 배경색(background), 테두리 굵기(borderwidth), 테두리 스타일(relief)을 설정한다.
    • relief는 평면(flat), 홈(groove), 돌출(ridge), 융기(solid) 또는 움푹 들어간(sunken)이 있다. 기본은 평면이다.
  3. 2에서 만든 스타일을 LabelFrame에 적용한다.

주의 : 기본적으로 ttk.Frame은 프레임 안의 위젯의 크기에 맞게 재조정된다. 프레임의 크기를 고정하고 싶으면 pack_propagate(False)나 grid_propagate(False)를 지정해야 한다.

padding

프레임 안에 다른 위젯을 배치하는 경우, 위젯과 프레임의 여백을 지정한다. 모든 면에 동일한 패딩을 지정하거나, 가로 및 세로 패딩을 서로 다르게 지정하거나 각 면에 별도로 패딩을 지정할 수 있다.

tkinter.ttk모듈은 padding옵션을 직접지원한다. 이 옵션은 아래의 예제와 같이 설정할 수 있다.

f = LabelFrame(master, padding=5) # 모든 면에 5픽셀의 패딩을 갖는다.
f = LabelFrame(master, padding=(5,10)) # 왼쪽과 오른쪽은 5, 위와 아래는 10픽셀의 패딩을 갖는다.
f = LabelFrame(master, padding=(5,7,10,12)) # 왼쪽 5, 위쪽 7, 오른쪽 10 그리고 아래쪽은 12픽셀의 패딩을 갖는다.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("Frame Padding Example (tk.Frame)")
style = ttk.Style()
style.configure("custom.TLabelframe", borderwidth=2, relief="groove",background='red')
frame = ttk.LabelFrame(root,text='다양한 위젯 추가', style="custom.TLabelframe" )
frame.pack(padx=10, pady=30)  # win과 프레임 사이에 가로 10, 세로 30픽셀의 공간을 둔다. 
label = tk.Label(frame, text="This is inside the frame.", background='green')
label.pack(padx=30, pady=10) #레이블과 프레임 사이에 세로 30, 가로 10픽셀의 공간은 둔다. 

button = tk.Button(frame, text="Click Me",background='gray')
button.pack(padx=10, pady=30)

root.mainloop()

import tkinter as tk
from tkinter import ttk
win = tk.Tk()
win.geometry('200x120')
s1 = ttk.Style()
s1.configure('Danger.TLabelframe', background='red', borderwidth=15, relief='raised')
ttk.LabelFrame(win, text='예제',width=100, height=50, style='Danger.TLabelframe').grid()
s2 = ttk.Style()
s1.configure('Danger2.TFrame', background='green', borderwidth=15, relief='raised')
ttk.Frame(win, width=100, height=50, style='Danger2.TFrame').grid()

win.mainloop()

예제

기본예제

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("LabelFrame 기본 예제")

frame = ttk.LabelFrame(root, text="회원 정보", padding=10)
frame.pack(padx=20, pady=20)

ttk.Label(frame, text="이름:").grid(row=0, column=0, sticky="w")
ttk.Entry(frame).grid(row=0, column=1)

ttk.Label(frame, text="나이:").grid(row=1, column=0, sticky="w")
ttk.Entry(frame).grid(row=1, column=1)

root.mainloop()

로그인 화면

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("LabelFrame 응용 예제")

login_frame = ttk.LabelFrame(root, text="로그인", padding=10)
login_frame.pack(padx=10, pady=10, fill="x")

ttk.Label(login_frame, text="아이디:").grid(row=0, column=0)
ttk.Entry(login_frame).grid(row=0, column=1)

ttk.Label(login_frame, text="비밀번호:").grid(row=1, column=0)
ttk.Entry(login_frame, show="*").grid(row=1, column=1)

ttk.Button(login_frame, text="로그인").grid(row=2, column=0, columnspan=2, pady=5)

root.mainloop()

연습문제

  1. LabelFrame을 사용하여 "개인 프로필" 그룹을 만들고, 이름/직업/이메일 입력 칸과 저장 버튼을 넣으세요.

정답 :

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("과제 1")

lf = ttk.LabelFrame(root, text="개인 프로필", padding=10)
lf.pack(padx=10, pady=10)

labels = ["이름", "직업", "이메일"]
for i, text in enumerate(labels):
    ttk.Label(lf, text=f"{text}:").grid(row=i, column=0, sticky="w")
    ttk.Entry(lf).grid(row=i, column=1)

ttk.Button(lf, text="저장").grid(row=3, column=0, columnspan=2, pady=5)

root.mainloop()
  1. LabelFrame을 세로로 두 개 만들어 위쪽은 로그인, 아래쪽은 회원가입 폼을 구현하세요.

정답 :

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("과제 2")

lf_login = ttk.LabelFrame(root, text="로그인", padding=10)
lf_login.pack(fill="x", padx=10, pady=5)
ttk.Label(lf_login, text="아이디").grid(row=0, column=0)
ttk.Entry(lf_login).grid(row=0, column=1)
ttk.Label(lf_login, text="비밀번호").grid(row=1, column=0)
ttk.Entry(lf_login, show="*").grid(row=1, column=1)
ttk.Button(lf_login, text="로그인").grid(row=2, column=0, columnspan=2)

lf_signup = ttk.LabelFrame(root, text="회원가입", padding=10)
lf_signup.pack(fill="x", padx=10, pady=5)
for i, text in enumerate(["아이디", "비밀번호", "이메일"]):
    ttk.Label(lf_signup, text=text).grid(row=i, column=0)
    ttk.Entry(lf_signup).grid(row=i, column=1)
ttk.Button(lf_signup, text="가입하기").grid(row=3, column=0, columnspan=2)

root.mainloop()
  1. LabelFrame 스타일을 변경하여 배경을 하늘색, 제목 글자를 빨간색 Bold로 만들고 안에 버튼 3개를 넣으세요.

정답 :

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("과제 3")

style = ttk.Style()
style.configure("Sky.TLabelframe", background="lightblue", borderwidth=2, relief="solid")
style.configure("Sky.TLabelframe.Label", font=("Arial", 10, "bold"), foreground="red")

lf = ttk.LabelFrame(root, text="버튼 모음", padding=10, style="Sky.TLabelframe")
lf.pack(padx=10, pady=10)

for i in range(3):
    ttk.Button(lf, text=f"버튼 {i+1}").pack(fill="x", pady=2)

root.mainloop()
  1. LabelFrame 안에서 Radiobutton 3개를 넣고, 선택된 값을 Label에 실시간 표시하는 프로그램을 작성하세요. 정답:
import tkinter as tk
from tkinter import ttk

def update_label():
    lbl_result.config(text=f"선택됨: {var.get()}")

root = tk.Tk()
root.title("과제 4")

var = tk.StringVar(value="")

lf = ttk.LabelFrame(root, text="옵션 선택", padding=10)
lf.pack(padx=10, pady=10)

options = ["옵션 1", "옵션 2", "옵션 3"]
for opt in options:
    ttk.Radiobutton(lf, text=opt, value=opt, variable=var, command=update_label).pack(anchor="w")

lbl_result = ttk.Label(root, text="선택됨: 없음")
lbl_result.pack(pady=5)

root.mainloop()
첫 글입니다.
다음 글
댓글
댓글로 소통하세요.