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 Entry
widget:
validate
: especifica qual tipo de evento acionará a validação.validatecommand
: verifica se um dado é válidoinvalidcommand
: é executado quando os dados são inválidos. Em outras palavras, ele será executado sevalidatecommand
retornarFalse
.
validar
O validate
comando 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 validatecommand
que usa o self.validate()
método e %P
o 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 invalidcommand
també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 invalidcommand
opçã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 %P
o código de substituição:
vcmd = (self.register(self.validate), '%P')
Linguagem de código: Python ( python )
Segundo, crie o invalidatecommand
que usa o self.on_invalid
método:
ivcmd = (self.register(self.on_invalid),)
Linguagem de código: Python ( python )
Terceiro, configure o widget de entrada que usa validation
, validatecommand
e 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_error
widget e a cor do texto do email_entry
widget:
def show_message(self, error='', color='black'):
self.label_error['text'] = error
self.email_entry['foreground'] = color
Linguagem 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 True
Linguagem de código: Python ( python )
O validate()
método retorna True
se o texto de entrada for válido ou False
nã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_entry
widget 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
,validatecommand
einvalidcommand
em qualquer widget de entrada para validar dados. - Passe um callable para o
widget.register()
método para criar um comando para as opçõesvalidatecommand
einvalidcommand
. validationcommand
retornaTrue
se os dados são válidos ouFalse
não.invalidcommand
será executado se os dados não forem válidos ou quando ovalidatecommand
returnFalse
.