2024. 4. 4. 16:31ㆍGUI/tkinter
요약 : 이 튜토리얼에서는 Tkinter 유효성 검사를 사용하여 사용자 입력의 유효성을 검사하는 방법을 배웁니다.
Tkinter Validation 소개
Tkinter 유효성 검사는 Entry 위젯과 같은 입력 위젯에 사용할 수 있는 세 가지 옵션에 의존합니다.
- validate: 유효성 검사를 트리거할 이벤트 유형을 지정합니다.
- validatecommand: 데이터가 유효한지 확인합니다.
- invalidcommand: 데이터가 유효하지 않을 때 실행됩니다. 즉, validatecommand가 False를 반환 되면 실행됩니다.
확인
validate 명령은 다음 문자열 값 중 하나일 수 있습니다.
명령어 설명‘focus’ | 위젯이 포커스를 얻거나 잃을 때마다 유효성을 검사합니다. |
‘focusin’ | 위젯이 포커스를 받을 때마다 유효성을 검사합니다. |
‘focusout’ | 위젯이 포커스를 잃을 때마다 유효성을 검사합니다. |
‘key’ | 키 입력으로 인해 위젯의 내용이 변경될 때마다 유효성을 검사합니다. |
‘all’ | 위의 모든 상황에서 포커싱, 포커스아웃, 키를 검증합니다. |
'none' | 유효성 검사를 끄십시오. 이것이 기본값입니다. 'none'문자열은 Python의 None 값이 아닙니다. |
유효성 검사 명령
validatecommand는 다음을 포함하는 튜플입니다.
- Tcl/tk 함수에 대한 참조입니다.
- 0개 이상의 대체 코드는 함수에 전달하려는 이벤트를 트리거하는 정보를 지정합니다.
Tck/tk 함수에 대한 참조를 얻으려면 widget.register()메서드에 호출 가능 항목을 전달합니다. validatecommand와 함께 사용할 수 있는 문자열을 반환합니다.
다음 표에는 튜플과 함께 사용할 수 있는 대체 코드가 나와 있습니다.
코드 설명%d' | 작업 코드: 삭제 시도의 경우 0, 삽입 시도의 경우 1, 포커스 인, 포커스 아웃 또는 textvariable에 대한 변경을 위해 콜백이 호출된 경우 -1입니다. |
'%i' | 사용자가 텍스트를 삽입하거나 삭제하려고 하면 이 인수는 삽입 또는 삭제 시작의 인덱스가 됩니다. 콜백이 포커스 인, 포커스 아웃 또는 textvariable에 대한 변경으로 인해 발생한 경우, 인수는 -1입니다. |
'%P' | 변경이 허용되는 경우 텍스트에 적용되는 값입니다. |
'%s' | 변경 전 항목의 텍스트입니다. |
'%S' | 삽입이나 삭제로 인해 호출이 발생한 경우 이 인수는 삽입되거나 삭제되는 텍스트가 됩니다. |
'%v' | 위젯 validate 옵션의 현재 값입니다. |
'%V' | 이 콜백의 이유: textvariable 변경된 경우, 'focusin', 'focusout', 'key', 혹은 'forced' 중의 하나입니다. |
'%W' | 위젯의 이름입니다. |
다음 예제에서는 self.validate() 메서드와 %P 대체 코드를 사용하는 validatecommand를 구성합니다.
vcmd = (self.register(self.validate), '%P')
잘못된 명령
validatecommand와 마찬가지로 invalidcommand에도 widget.register() 메서드와 대체 코드를 사용해야 합니다.
다음 예에서는 invalidcommand 옵션에 전달할 수 있는 튜플을 반환합니다.
ivcmd = (self.register(self.on_invalid),)
Tkinter 검증 예
이메일 입력이 포함된 양식을 생성하겠습니다. 잘못된 이메일 주소를 입력하면 오류 메시지가 표시되고 입력된 이메일의 텍스트 색상이 빨간색으로 변경됩니다. 그리고 초점이 항목 밖으로 이동할 때 유효성 검사 이벤트를 트리거합니다.
전체 프로그램은 다음과 같습니다.
import tkinter as tk
from tkinter import ttk
import re
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Tkinter Validation Demo')
self.create_widgets()
def create_widgets(self):
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=3)
self.columnconfigure(2, weight=1)
# label
ttk.Label(text='Email:').grid(row=0, column=0, padx=5, pady=5)
# email entry
vcmd = (self.register(self.validate), '%P')
ivcmd = (self.register(self.on_invalid),)
self.email_entry = ttk.Entry(self, width=50)
self.email_entry.config(validate='focusout', validatecommand=vcmd, invalidcommand=ivcmd)
self.email_entry.grid(row=0, column=1, columnspan=2, padx=5)
self.label_error = ttk.Label(self, foreground='red')
self.label_error.grid(row=1, column=1, sticky=tk.W, padx=5)
# button
self.send_button = ttk.Button(text='Send').grid(row=0, column=4, padx=5)
def show_message(self, error='', color='black'):
self.label_error['text'] = error
self.email_entry['foreground'] = color
def validate(self, value):
"""
Validat the email entry
:param value:
:return:
"""
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
if re.fullmatch(pattern, value) is None:
return False
self.show_message()
return True
def on_invalid(self):
"""
Show the error message if the data is not valid
:return:
"""
self.show_message('Please enter a valid email', 'red')
if __name__ == '__main__':
app = App()
app.mainloop()
동작 방식.
먼저 self.validate()메서드와 %P대체 코드를 사용하여 유효성 검사 명령을 만듭니다.
vcmd = (self.register(self.validate), '%P')
둘째, 다음 self.on_invalid 메서드를 사용하는 invalidatecommand을 만듭니다.
ivcmd = (self.register(self.on_invalid),)
셋째, validation, validatecommand 및 invalidatecommand을 사용하는 항목 위젯을 구성합니다.
self.email_entry.config(validate='focusout', validatecommand=vcmd, invalidcommand=ivcmd)
넷째, label_error 위젯의 텍스트와 email_entry 위젯의 텍스트 색상을 변경하는 show_message() 메서드를 정의합니다.
def show_message(self, error='', color='black'):
self.label_error['text'] = error
self.email_entry['foreground'] = color
다섯째, email_entry의 값을 검증하는 validate() 메서드를 정의합니다.
def validate(self, value):
"""
Validat the email entry
:param value:
:return:
"""
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
if re.fullmatch(pattern, value) is None:
return False
self.show_message()
return True
이 validate()메서드는 입력 텍스트가 유효하면 True, 그렇지 않으면 False 여부를 반환합니다. 입력된 텍스트가 유효한 이메일 주소인 경우, show_message()를 호출하여 오류 메시지를 숨기고 텍스트 색상을 검은색으로 설정합니다.
Tkinter는 입력 텍스트가 유효한 이메일 주소가 아닌 경우 on_invalid() 메소드를 실행합니다.
마지막으로 오류 메시지를 표시하는 on_invalid() 메소드를 정의하고 email_entry 위젯의 텍스트 색상을 빨간색으로 설정합니다.
def on_invalid(self):
"""
Show the error message if the data is not valid
:return:
"""
self.show_message('Please enter a valid email', 'red')
요약
- Tkinter는 입력 위젯의 validate, validatecommand 및 invalidcommand 옵션을 사용하여 데이터의 유효성을 검사 합니다.
- validatecommand 및 invalidcommand 옵션에 대한 명령을 생성하려면 widget.register() 메서드에 콜러블을 전달합니다.
- validationcommand는 데이터가 유효하면 True를 그렇지 않으면 False를 반환합니다.
- invaidcommand는 데이터가 유효하지 않거나 validatecommand가 False를 반환하면 실행됩니다.
'GUI > tkinter' 카테고리의 다른 글
Tkinter System Tray. (0) | 2024.04.06 |
---|---|
Tkinter Matplotlib (0) | 2024.04.05 |
Tkinter MVC (0) | 2024.04.03 |
How to Display a Progress Bar while a Thread is Running in Tkinter (0) | 2024.04.02 |
How to Schedule an Action with Tkinter after() method (0) | 2024.04.02 |