강의노트 LabelFrame
강의노트
• 조회수 166
• 댓글 0
• 작성 11개월 전
• 수정 1개월 전
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()
- style을 만들기 위해서는 ttk의 Style()을 호출한다
- style의 configure를 통해 원하는 스타일로 바꿔준다.
- "Custom.TLabelFrame"은 기본 스타일은 "TLabelFrame"이다. 이를 원하는 형태의 스타일로 바꿀때 이름(Custom)으로 바꿔주는 것을 의미한다.
- 배경색(background), 테두리 굵기(borderwidth), 테두리 스타일(relief)을 설정한다.
- relief는 평면(flat), 홈(groove), 돌출(ridge), 융기(solid) 또는 움푹 들어간(sunken)이 있다. 기본은 평면이다.
- 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()
연습문제
- 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()
- 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()
- 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()
- 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()
첫 글입니다.
다음 글
로그인 하면 댓글을 쓸 수 있습니다.