Validação Tkinter

Resumo : neste tutorial, você aprenderá como usar a validação Tkinter para validar entradas do usuário.

Introdução à validação Tkinter

A validação do Tkinter depende de três opções que você pode usar para qualquer widget de entrada, como Entrywidget:

  • validate: especifica qual tipo de evento acionará a validação.
  • validatecommand: verifica se um dado é válido
  • invalidcommand: é executado quando os dados são inválidos. Em outras palavras, ele será executado se validatecommandretornar False.

validar

O validatecomando pode ser um dos seguintes valores de string:

‘foco’ Valide sempre que o widget obtiver ou perder o foco
‘foco no’ Valide sempre que o widget receber foco.
‘foco fora’ Valide sempre que o widget perder o foco
‘chave’ Valide sempre que qualquer pressionamento de tecla alterar o conteúdo do widget.
‘todos’ Valide em todas as situações acima foco, foco e chave
‘nenhum’ Desligue a validação. Este é o padrão. Observe que a string 'none'não é o None valor em Python.

comando de validação

A validatecommandé uma tupla que contém:

  • Uma referência a uma função Tcl/tk.
  • Zero ou mais códigos de substituição especificam as informações que acionam o evento que você deseja passar para a função.

Para obter uma referência a uma função Tck/tk, você passa um callable para o widget.register()método. Ele retorna uma string que você pode usar com o arquivo validatecommand.

A tabela a seguir mostra os códigos de substituição que você pode usar com a tupla:

%d' Código de ação: 0 para uma tentativa de exclusão, 1 para uma tentativa de inserção ou -1 se o retorno de chamada foi chamado para foco de entrada, foco de saída ou uma alteração no arquivo  textvariable.
'%i' Quando o usuário tentar inserir ou excluir texto, este argumento será o índice do início da inserção ou exclusão. Se o retorno de chamada foi devido ao foco de entrada, foco de saída ou uma alteração no  textvariable, o argumento será  -1.
'%P' O valor que o texto terá se a alteração for permitida.
'%s' O texto na entrada antes da alteração.
'%S' Se a chamada foi por inserção ou exclusão, este argumento será o texto que está sendo inserido ou excluído.
'%v' O valor atual da  validate opção do widget.
'%V' O motivo deste retorno de chamada: um de  'focusin''focusout''key'ou  'forced' se  textvariable foi alterado.
'%W' O nome do widget.

O exemplo a seguir constrói um validatecommandque usa o self.validate()método e %Po código de substituição:

vcmd = (self.register(self.validate), '%P')Linguagem de código:  Python  ( python )

comando inválido

Assim como o validatecommand, o invalidcommandtambém requer o uso do widget.register()método e do código de substituição.

O exemplo a seguir retorna uma tupla que você pode passar para a invalidcommandopção:

ivcmd = (self.register(self.on_invalid),)Linguagem de código:  Python  ( python )

Exemplo de validação Tkinter

Criaremos um formulário que contém uma entrada de e-mail. Se você inserir um endereço de e-mail inválido, será exibida uma mensagem de erro e a cor do texto do e-mail inserido será alterada para vermelho. E acionaremos o evento de validação quando o foco estiver saindo da entrada.

Aqui está o programa completo:

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()Linguagem de código:  Python  ( python )

Como funciona.

Primeiro, crie um comando de validação usando o self.validate()método e %Po código de substituição:

vcmd = (self.register(self.validate), '%P')Linguagem de código:  Python  ( python )

Segundo, crie o invalidatecommandque usa o self.on_invalidmétodo:

ivcmd = (self.register(self.on_invalid),)Linguagem de código:  Python  ( python )

Terceiro, configure o widget de entrada que usa validation, validatecommande invalidatecommand:

self.email_entry.config(validate='focusout', validatecommand=vcmd, invalidcommand=ivcmd)Linguagem de código:  Python  ( python )

Quarto, defina o show_message()método que altera o texto do label_errorwidget e a cor do texto do email_entrywidget:

def show_message(self, error='', color='black'):
    self.label_error['text'] = error
    self.email_entry['foreground'] = colorLinguagem de código:  Python  ( python )

Quinto, defina o validate()método que valida o valor do email_entry.

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 TrueLinguagem de código:  Python  ( python )

O validate()método retorna Truese o texto de entrada for válido ou Falsenão. Caso o texto de entrada seja um endereço de e-mail válido, chame o show_message()para ocultar a mensagem de erro e defina a cor do texto como preto.

O Tkinter executará o on_invalid()método se o texto de entrada não for um endereço de e-mail válido.

Por fim, defina o on_invalid()método que mostra uma mensagem de erro e defina a cor do texto do email_entrywidget como vermelho.

def on_invalid(self):
    """
    Show the error message if the data is not valid
    :return:
    """
    self.show_message('Please enter a valid email', 'red')Linguagem de código:  Python  ( python )

Resumo

  • Tkinter usa as opções validate, validatecommande invalidcommandem qualquer widget de entrada para validar dados.
  • Passe um callable para o widget.register()método para criar um comando para as opções validatecommande invalidcommand.
  • validationcommandretorna Truese os dados são válidos ou Falsenão.
  • invalidcommandserá executado se os dados não forem válidos ou quando o validatecommandreturn False.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *