강의노트 Entry
entry
entry는 한 줄의 텍스트를 입력할 수 있는 위젯이다. 웹사이트나 앱에서 아이디, 비밀번호, 이름 등을 입력하는 칸이 바로 이 Entry 위젯과 비슷하다고 생각하면 된다.
기본 entry 생성
from tkinter import *
win = Tk()
L1 = Label(win, text="이름 : ") #1
L1.pack(side=LEFT) #2
E1 = Entry(win, bd=5) #3
E1.pack(side=RIGHT) #4
win.mainloop()
- 레이블 L1에 엔트리의 설명을 써넣는다
- 레이블을 창의 왼쪽에 붙인다.
- 테두리가 5인 엔트리를 win안에 만든다.
- 엔트리를 win의 오른쪽으로 붙인다.
entry의 글자 모양이나 크기는 "font=('Arial', 14)"와 같은 entry의 옵션으로 제공한다.
entry에 입력하는 글자를 '*'로 표시하는 방법은 "show='*' "의 옵션을 입력하면 된다.
entry에 입력한 문자열은 "entry변수명.get()"으로 가져올 수 있다.
"entry변수명.delete(0,END)"는 entry에 입력한 모든 문자열을 지운다.
entry의 주요 옵션들
entry 위젯의 중요한 옵션은 다음과 같다.
열 1 | 열 2 | 열 3 |
---|---|---|
textvariable | tk.StringVar와 연결하여 실시간으로 텍스트를 제어하는 데 필수적입니다. | 텍스트 |
width | 위젯의 너비를 문자의 개수로 지정 | ttk.Entry(root, width=40) |
show | 입력되는 텍스트 대신 다른 문자를 표시 | ttk.Entry(root, show="" ) |
state | 위젯의 상태를 제어, normal(텍스트를 입력하고 수정), disabled(비활정화), readonly(읽을수는 있지만 수정 불가) | ttk.Entry(root, state="disabled") |
font | 입력되는 텍스트의 글꼴, 크기, 스타일을 지정 (글꼴이름, 크기, 스타일)형식으로 사용 | ttk.Entry(root, font=("Malgun Gothic", 12)) |
justify | 텍스트의 정렬 방식을 지정, left, center, right중 하나를 사용 | ttk.Entry(root, justify="center") |
예제
entry와 label을 이용한 프로그램
entry 위젯으로 사용자 입력을 받고, 그 내용을 Label에 실시간으로 표시
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("실시간 입력 & 표시")
root.geometry("400x200")
root.resizable(False, False) # 윈도우 크기 변경 불가
# 1. Entry와 Label을 연결할 Tkinter 문자열 변수 생성
user_text = tk.StringVar()
user_text.set("이곳에 이름을 입력하세요.") # Entry의 초기 텍스트 설정
# 2. Entry 위젯 생성: 사용자가 텍스트를 입력할 곳
# textvariable을 user_text와 연결하여 Entry의 내용이 자동으로 user_text에 저장되도록 합니다.
input_entry = ttk.Entry(
root,
textvariable=user_text, # StringVar와 연결
width=35, # Entry의 너비를 대략 35글자 폭으로 설정
font=("Malgun Gothic", 14), # 글꼴과 크기 설정
justify=tk.CENTER # 텍스트를 가운데 정렬
)
input_entry.pack(pady=20) # 상하 여백 20px
# Entry 위젯에 프로그램 시작 시 자동으로 커서가 가도록 설정
input_entry.focus_set()
# 3. Label 위젯 생성: Entry에 입력된 내용을 실시간으로 보여줄 곳
# textvariable을 user_text와 연결하여 user_text의 내용이 바뀔 때마다 Label도 업데이트됩니다.
display_label = ttk.Label(
root,
textvariable=user_text, # StringVar와 연결
font=("Malgun Gothic", 18, "bold"), # 글꼴, 크기, 스타일 설정
foreground="blue" # 글자색 설정
)
display_label.pack(pady=10) # 상하 여백 10px
# 4. 안내 메시지 Label
info_label = ttk.Label(
root,
text="Entry에 텍스트를 입력하면 Label에 바로 나타납니다!",
font=("Malgun Gothic", 10),
foreground="gray"
)
info_label.pack(pady=5)
root.mainloop()
tk.StringVar()로 user_text 변수를 생성하고, 이 변수를 ttk.Entry의 textvariable과 ttk.Label의 textvariable에 모두 연결한다.
이렇게 하면 Entry에 텍스트를 입력하는 즉시 user_text 변수의 값이 바뀌고, 그 변화가 Label에도 반영되어 화면에 실시간으로 표시된다.
예1
사용자 이름과 패스워드를 입력받는 시스템을 만든다. 사용자 이름과 패스워드는 Arial, 14포인트이고 패스워드는 입력하면 ''로 보이게 만든다.
import tkinter as tk
from tkinter import ttk
def fend():
window.destroy()
def frun():
s = e2.get()
print(s)
if s == '1234':
lbl3.configure(text='맞는 비번입니다.')
else:
lbl3.configure(text='틀린 비번입니다.')
window = tk.Tk()
window.title('비밀번호 입력')
lbl1 = tk.Label(window, text='사용자 : ')
lbl1.grid(row = 0, column=0)
lbl3 = tk.Label(window, text='')
lbl3.grid(row = 2, column=0,columnspan=2)
e1 = tk.Entry(window, show=None, font=('Arial', 14))
e1.focus()
e1.grid(row = 0, column=1)
lbl2 = tk.Label(window, text='비밀번호 : ')
lbl2.grid(row = 1, column=0)
e2 = tk.Entry(window, show='*', font=('Arial', 14))
e2.grid(row = 1, column=1)
b1 = tk.Button(window,text='실행',command=frun)
b1.grid(row=3, column=0,ipadx=10)
b2 = tk.Button(window,text='종료',command=fend)
b2.grid(row=3, column=1)
window.mainloop()
예2
다음 그림과 같은 창을 만들어라. 폰트는 Arial, 18폰트로 사용한다.
레이블은 엔트리에 입력한 이름을 합해서 결과를 출력한다.
답)
from tkinter import *
def fres():
s = '입력한 이름은 '+E1.get()+'입니다.'
L2.configure(text=s)
def fend():
win.destroy()
win = Tk()
L1 = Label(win, text="이름 :", font=('Arial',18))
L1.grid(row=0, column=0)
E1 = Entry(win, bd=5, font=('Arial',18))
E1.grid(row=0, column=2)
L2 = Label(win, text="입력한 이름은:", font=('Arial',18))
L2.grid(row=1, column=0,columnspan=3)
b1 = Button(win,text='실행',font=('Arial',18), command=fres)
b1.grid(row=2, column=1)
b2 = Button(win,text='종료',font=('Arial',18), command=fend)
b2.grid(row=2, column=2)
win.mainloop()
연습문제
- "당신의 이름을 입력하세요:"라는 Label과 옆에 이름을 입력할 Entry를 만든다. Entry 아래에 "환영합니다!"라는 초기 텍스트를 가진 Label을 만든다.
"인사하기" 버튼을 만들고, 이 버튼을 클릭하면 Entry에 입력된 이름으로 "환영합니다, [이름]님!"과 같이 아래 Label의 텍스트가 바뀌도록 만든다.
정답 :
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("이름 입력 및 환영 메시지")
root.geometry("350x200")
root.resizable(False, False)
# 이름 입력 Entry와 연결할 StringVar
name_var = tk.StringVar()
# 환영 메시지를 표시할 Label과 연결할 StringVar
welcome_message_var = tk.StringVar()
welcome_message_var.set("환영합니다!") # 초기 메시지 설정
# Frame을 사용하여 Label과 Entry를 한 줄에 배치
input_frame = ttk.Frame(root)
input_frame.pack(pady=10)
# 이름 입력 안내 Label
name_label = ttk.Label(input_frame, text="당신의 이름을 입력하세요:", font=("Malgun Gothic", 12))
name_label.pack(side=tk.LEFT, padx=5)
# 이름 입력 Entry
name_entry = ttk.Entry(input_frame, textvariable=name_var, width=25, font=("Malgun Gothic", 12))
name_entry.pack(side=tk.LEFT, padx=5)
name_entry.focus_set()
# 환영 메시지 Label
message_label = ttk.Label(root, textvariable=welcome_message_var, font=("Malgun Gothic", 16, "bold"), foreground="green")
message_label.pack(pady=20)
# 인사하기 버튼 클릭 시 실행될 함수
def greet_user():
name = name_var.get().strip() # Entry에서 이름 가져오기 및 양쪽 공백 제거
if name: # 이름이 비어있지 않다면
welcome_message_var.set(f"환영합니다, {name}님!")
else: # 이름이 비어있다면
welcome_message_var.set("이름을 입력해주세요!")
name_entry.focus_set() # 다시 Entry로 포커스 이동
# 인사하기 버튼
greet_button = ttk.Button(root, text="인사하기", command=greet_user)
greet_button.pack(pady=10)
root.mainloop()
- "비밀번호:"라는 Label과 비밀번호를 입력할 Entry를 만드세요. Entry에는 입력 내용이 로 표시되도록 설정하세요.
Entry 아래에 "비밀번호를 입력하세요."라는 초기 텍스트를 가진 Label을 만드세요.
"확인" 버튼을 만들고, 버튼 클릭 시 Entry의 비밀번호가 "1234"와 같으면 아래 Label에 "로그인 성공!"을, 다르면 "로그인 실패!"를 표시하도록 만드세요.
정답 :
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("비밀번호 입력 확인")
root.geometry("350x200")
root.resizable(False, False)
# 비밀번호 Entry와 연결할 StringVar
password_var = tk.StringVar()
# 결과 메시지를 표시할 Label과 연결할 StringVar
result_message_var = tk.StringVar()
result_message_var.set("비밀번호를 입력하세요.") # 초기 메시지
# Frame을 사용하여 Label과 Entry를 한 줄에 배치
input_frame = ttk.Frame(root)
input_frame.pack(pady=10)
# 비밀번호 안내 Label
pw_label = ttk.Label(input_frame, text="비밀번호:", font=("Malgun Gothic", 12))
pw_label.pack(side=tk.LEFT, padx=5)
# 비밀번호 Entry (입력 내용이 '*'로 표시됨)
pw_entry = ttk.Entry(input_frame, textvariable=password_var, show="*", width=25, font=("Malgun Gothic", 12))
pw_entry.pack(side=tk.LEFT, padx=5)
pw_entry.focus_set()
# 결과 메시지 Label
result_label = ttk.Label(root, textvariable=result_message_var, font=("Malgun Gothic", 14, "bold"))
result_label.pack(pady=20)
# 확인 버튼 클릭 시 실행될 함수
def check_password():
entered_password = password_var.get() # Entry에서 비밀번호 가져오기
correct_password = "1234" # 정답 비밀번호 설정
if entered_password == correct_password:
result_message_var.set("로그인 성공!")
result_label.config(foreground="blue") # 성공 시 파란색 글자
else:
result_message_var.set("로그인 실패!")
result_label.config(foreground="red") # 실패 시 빨간색 글자
password_var.set("") # 비밀번호 입력 필드 초기화
pw_entry.focus_set() # 다시 Entry로 포커스 이동
# 확인 버튼
check_button = ttk.Button(root, text="확인", command=check_password)
check_button.pack(pady=10)
root.mainloop()
- "숫자를 입력하세요:"라는 Label과 숫자를 입력할 Entry를 만드세요.
Entry 아래에 "결과:"라는 초기 텍스트를 가진 Label을 만드세요.
"입력" 버튼을 만들고, 이 버튼을 클릭하면 Entry에 입력된 값이 숫자인지 확인하세요.
숫자이면 아래 Label에 "입력된 숫자: [입력값]"을 표시하세요.
숫자가 아니면 아래 Label에 "유효한 숫자가 아닙니다!"를 표시하세요. (힌트: isdigit() 문자열 메서드를 사용해 보세요.)
정답 :
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("숫자만 입력받기")
root.geometry("350x200")
root.resizable(False, False)
# 숫자 입력 Entry와 연결할 StringVar
number_var = tk.StringVar()
# 결과 메시지를 표시할 Label과 연결할 StringVar
result_message_var = tk.StringVar()
result_message_var.set("결과:") # 초기 메시지
# Frame을 사용하여 Label과 Entry를 한 줄에 배치
input_frame = ttk.Frame(root)
input_frame.pack(pady=10)
# 숫자 입력 안내 Label
num_label = ttk.Label(input_frame, text="숫자를 입력하세요:", font=("Malgun Gothic", 12))
num_label.pack(side=tk.LEFT, padx=5)
# 숫자 입력 Entry
num_entry = ttk.Entry(input_frame, textvariable=number_var, width=25, font=("Malgun Gothic", 12))
num_entry.pack(side=tk.LEFT, padx=5)
num_entry.focus_set()
# 결과 메시지 Label
result_label = ttk.Label(root, textvariable=result_message_var, font=("Malgun Gothic", 14, "bold"))
result_label.pack(pady=20)
# 입력 버튼 클릭 시 실행될 함수
def validate_number():
input_value = number_var.get().strip() # Entry에서 값 가져오기 및 공백 제거
if input_value.isdigit(): # isdigit()은 문자열이 모두 숫자로 구성되어 있는지 확인
result_message_var.set(f"입력된 숫자: {input_value}")
result_label.config(foreground="blue")
else:
result_message_var.set("유효한 숫자가 아닙니다!")
result_label.config(foreground="red")
number_var.set("") # Entry 내용 초기화
num_entry.focus_set() # 다시 Entry로 포커스 이동
# 입력 버튼
submit_button = ttk.Button(root, text="입력", command=validate_number)
submit_button.pack(pady=10)
root.mainloop()
- "여기에 텍스트를 입력하세요."라는 초기 텍스트를 가진 Entry를 만드세요.
Entry 아래에 "초기화" 버튼을 만드세요.
"초기화" 버튼을 클릭하면 Entry의 내용이 모두 지워지도록 만드세요. (힌트: textvariable의 set("")을 사용하거나, Entry 자체의 delete() 메서드를 사용해 보세요.)
정답 :
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Entry 내용 초기화")
root.geometry("300x150")
root.resizable(False, False)
# Entry와 연결할 StringVar
text_to_clear_var = tk.StringVar()
text_to_clear_var.set("여기에 텍스트를 입력하세요.") # 초기 텍스트
# Entry 위젯
my_entry = ttk.Entry(
root,
textvariable=text_to_clear_var,
width=40,
font=("Malgun Gothic", 12),
justify=tk.CENTER
)
my_entry.pack(pady=30)
my_entry.focus_set()
# 초기화 버튼 클릭 시 실행될 함수
def clear_entry():
# 방법 1: textvariable의 값을 빈 문자열로 설정
text_to_clear_var.set("")
# 방법 2: Entry 위젯의 delete() 메서드 사용 (시작 인덱스, 끝 인덱스)
# my_entry.delete(0, tk.END) # 0부터 끝까지 모든 텍스트 삭제
my_entry.focus_set() # 초기화 후 다시 Entry로 포커스 이동
# 초기화 버튼
clear_button = ttk.Button(root, text="초기화", command=clear_entry)
clear_button.pack(pady=10)
root.mainloop()
로그인 하면 댓글을 쓸 수 있습니다.