윈도우 프로그램 기본 위젯

강의노트 Entry

강의노트 • 조회수 709 • 댓글 0 • 작성 1년 전 • 수정 4주 전  
  • 윈도우 프로그램

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()
  1. 레이블 L1에 엔트리의 설명을 써넣는다
  2. 레이블을 창의 왼쪽에 붙인다.
  3. 테두리가 5인 엔트리를 win안에 만든다.
  4. 엔트리를 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()

연습문제

  1. "당신의 이름을 입력하세요:"라는 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()
  1. "비밀번호:"라는 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()
  1. "숫자를 입력하세요:"라는 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()
  1. "여기에 텍스트를 입력하세요."라는 초기 텍스트를 가진 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()
이전 글
다음 글
댓글
댓글로 소통하세요.