Tkinter에는 사용자로부터 텍스트를 입력받기 위한 두 가지 기본 위젯이 있습니다. 바로 Text 위젯과 Entry 위젯입니다. Text 위젯은 주로 여러 줄에 걸친 사용자 입력을 받을 때 사용되며, Entry 위젯은 한 줄짜리 텍스트만 입력할 수 있습니다.
이러한 위젯들은 내장 라이브러리 함수와 메서드를 활용해 다양하게 커스터마이징하고 추가 기능을 넣을 수 있습니다. 그중 Entry 위젯의 입력값을 검증하려면 register() 메서드를 사용하는 것이 좋습니다. 이 메서드는 나중에 콜백 함수를 호출할 수 있도록 해주는 문자열을 반환합니다.
입력 검증의 핵심: validate와 validatecommand
Entry 위젯의 입력을 검증하려면 config(**options) 메서드를 사용하고, 여기에 validate와 validatecommand 인자를 전달합니다. 각 인자의 역할은 다음과 같습니다.
validate — 콜백 함수가 언제 호출되어 입력값을 검증할지를 지정합니다. 예를 들어 값으로 "key"를 설정하면, 사용자가 키보드의 키를 누를 때마다 콜백 함수가 호출됩니다. 이 외에도 focus, focusin, focusout, none, all 등의 옵션을 사용할 수 있습니다.
validatecommand — 콜백 함수가 반환하는 값에 따라 검증 결과를 결정합니다. validatecommand='f' 형태로 값을 지정할 때는 다양한 콜백 치환 코드(Callback substitution code)를 활용하여 콜백 함수가 어떤 값을 어떤 방식으로 반환할지 정의할 수 있습니다.
즉, Entry 위젯의 입력을 검증하려면 먼저 콜백 함수를 등록(register)한 뒤, 해당 함수에서 정의한 조건을 확인하도록 Entry 위젯을 설정(configure)해야 합니다.
예제: 삭제 불가능한 기본 텍스트 만들기
이번 예제에서는 사용자가 특정 텍스트를 지울 수 없도록 Entry 위젯을 검증하는 방법을 살펴보겠습니다. 핵심 아이디어는 startswith("문자열") 함수를 사용해 입력된 문자열이 특정 접두사로 시작하는지 확인하는 것입니다. 접두사가 유지되는 동안에는 True를 반환하여 입력을 허용하고, 그렇지 않으면 False를 반환해 변경을 차단합니다.
# 필요한 라이브러리 임포트
from tkinter import *
# tkinter 윈도우 인스턴스 생성
win = Tk()
win.geometry("700x350")
# 텍스트를 삭제 불가능하게 만드는 함수 정의
def make_non_removable(text):
return text.startswith("Enter your Email Id:")
# Entry 위젯 생성
entry = Entry(win, bg="black", fg="white")
entry.pack(side="top", fill="x")
# 기본 텍스트 삽입
entry.insert(END, "Enter your Email Id:")
validate_entry = (win.register(make_non_removable), '%P')
entry.config(validate='key', validatecommand=validate_entry)
win.mainloop()
실행 결과
위 코드를 실행하면 윈도우에 Entry 위젯이 표시되며, "Enter your Email Id:"라는 기본 텍스트가 포함되어 있습니다. 이 텍스트는 사용자가 백스페이스나 Delete 키로 지우려고 해도 항상 접두사가 유지되므로 삭제할 수 없습니다. 반면, 접두사 뒤의 영역에는 자유롭게 이메일 주소를 입력할 수 있습니다.

이처럼 register()와 validatecommand를 조합하면 플레이스홀더 성격의 안내 문구를 보호하거나, 필수 접두어가 포함된 입력 형식을 강제하는 등 다양한 입력 검증 로직을 손쉽게 구현할 수 있습니다.