Tkinter Validation

2024. 4. 4. 16:31GUI/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