Resumo : neste tutorial você aprenderá sobre o StringVar
objeto Tkinter e como usá-lo para manipular valores de widgets.
Introdução ao Tkinter StringVar
O Tkinter StringVar
ajuda você a gerenciar o valor de um widget como um Label
ou Entry
de forma mais eficaz.
Para criar um novo StringVar
objeto, você usa o StringVar
construtor assim:
string_var = tk.StringVar(container, value, name)
Linguagem de código: Python ( python )
O StringVar
construtor aceita três argumentos opcionais:
container
é um widget ao qual oStringVar
objeto está associado. Se você ignorar o contêiner, o padrão será a janela raiz.value
é o valor inicial cujo padrão é uma string vazia''
.name
é um nome Tcl cujo padrão é, porPY_VARnum
exemploPY_VAR1
,PY_VAR2
, , etc.
Depois de criar o StringVar
objeto, você pode atribuí-lo a textvariable
um widget que aceita um StringVar
objeto.
Por exemplo, o seguinte atribui o string_var
to textvariable
do Entry
widget:
name_entry = ttk.Entry(root, textvariable=string_var)
Linguagem de código: Python ( python )
Para obter o valor atual do Entry
widget, você pode usar o get()
método do StringVar
objeto:
name_var.get()
Linguagem de código: Python ( python )
O StringVar
objeto irá notificá-lo sempre que seu valor mudar. Este recurso é útil se você deseja atualizar automaticamente outros widgets com base no valor atual do StringVar
objeto.
Para invocar um retorno de chamada sempre que o valor de um StringVar
objeto for alterado, você usa o trace()
método do StringVar
objeto:
string_var.trace('w', callback)
Linguagem de código: Python ( python )
O 'w'
modo invocará automaticamente callback
sempre que o valor do valor for string_var
alterado.
O StringVar
também oferece dois outros modos 'r'
e 'u'
:
'r'
(ler) – invoca o retorno de chamada sempre que a variável é lida.'u'
(não definido) – invoca o retorno de chamada sempre que a variável é excluída.
Exemplo StringVar do Tkinter
O exemplo a seguir ilustra como usar o StringVar
objeto para um Entry
widget:
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Tkinter StringVar')
self.geometry("300x80")
self.name_var = tk.StringVar()
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.columnconfigure(2, weight=1)
self.create_widgets()
def create_widgets(self):
padding = {'padx': 5, 'pady': 5}
# label
ttk.Label(self, text='Name:').grid(column=0, row=0, **padding)
# Entry
name_entry = ttk.Entry(self, textvariable=self.name_var)
name_entry.grid(column=1, row=0, **padding)
name_entry.focus()
# Button
submit_button = ttk.Button(self, text='Submit', command=self.submit)
submit_button.grid(column=2, row=0, **padding)
# Output label
self.output_label = ttk.Label(self)
self.output_label.grid(column=0, row=1, columnspan=3, **padding)
def submit(self):
self.output_label.config(text=self.name_var.get())
if __name__ == "__main__":
app = App()
app.mainloop()
Linguagem de código: Python ( python )
Saída:
Como funciona.
Primeiro, crie um novo StringVar
objeto no __init__()
método da App
classe:
self.name_var = tk.StringVar()
Linguagem de código: Python ( python )
Segundo, atribua o StringVar
objeto à textvariable
opção do Entry
widget no create_widgets()
método:
name_entry = ttk.Entry(self, textvariable=self.name_var)
Linguagem de código: Python ( python )
Terceiro, defina o texto do output_label
widget para o valor do name_var
objeto quando o botão for clicado.
self.output_label.config(text=self.name_var.get())
Linguagem de código: Python ( python )
Tkinter StringVar – Exemplo de rastreamento de alterações de texto
O exemplo a seguir ilustra como usar o StringVar
objeto para rastrear alterações de texto.
A janela raiz possui dois Entry
widgets: senha e confirmação de senha. Se você inserir uma senha de confirmação diferente da senha, será exibida uma mensagem de erro. Caso contrário, mostrará uma mensagem de sucesso:
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
ERROR = 'Error.TLabel'
SUCCESS = 'Success.TLabel'
def __init__(self):
super().__init__()
self.title('Change Password')
self.geometry("300x130")
self.password_var = tk.StringVar()
self.confirm_password_var = tk.StringVar()
self.confirm_password_var.trace('w', self.validate)
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.columnconfigure(2, weight=1)
# set style
self.style = ttk.Style(self)
self.style.configure('Error.TLabel', foreground='red')
self.style.configure('Success.TLabel', foreground='green')
self.create_widgets()
def create_widgets(self):
""" create a widget
"""
padding = {'padx': 5, 'pady': 5, 'sticky': tk.W}
# message
self.message_label = ttk.Label(self)
self.message_label.grid(column=0, row=0, columnspan=3, **padding)
# password
ttk.Label(self, text='New Password:').grid(column=0, row=1, **padding)
password_entry = ttk.Entry(
self, textvariable=self.password_var, show='*')
password_entry.grid(column=1, row=1, **padding)
password_entry.focus()
# Confirm password
ttk.Label(self, text='Confirm Password:').grid(
column=0, row=2, **padding)
confirm_password = ttk.Entry(
self, textvariable=self.confirm_password_var, show='*')
confirm_password.grid(column=1, row=2, **padding)
confirm_password.focus()
# Change button
submit_button = ttk.Button(self, text='Change')
submit_button.grid(column=0, row=3, **padding)
def set_message(self, message, type=None):
""" set the error or success message
"""
self.message_label['text'] = message
if type:
self.message_label['style'] = type
def validate(self, *args):
""" validate the password
"""
password = self.password_var.get()
confirm_password = self.confirm_password_var.get()
if confirm_password == password:
self.set_message(
"Success: The new password looks good!", self.SUCCESS)
return
if password.startswith(confirm_password):
self.set_message('Warning: Keep entering the password')
self.set_message("Error: Passwords don't match!", self.SUCCESS)
if __name__ == "__main__":
app = App()
app.mainloop()
Linguagem de código: Python ( python )
Como funciona:
Primeiro, defina duas constantes ERROR
e SUCCESS
que serão definidas com message_label
base no resultado da validação:
ERROR = 'Error.TLabel'
SUCCESS = 'Success.TLabel'
WARNING = 'Warning.TLabel'
Linguagem de código: Python ( python )
Segundo, crie dois StringVar
objetos:
self.password_var = tk.StringVar()
self.confirm_password_var = tk.StringVar()
Linguagem de código: Python ( python )
Terceiro, use o trace()
método para chamar o self.validate()
método sempre que o texto do widget de confirmação de senha for alterado:
self.confirm_password_var.trace('w', self.validate)
Linguagem de código: Python ( python )
Por fim, mostre a mensagem de sucesso se as senhas corresponderem no validate()
método. Caso contrário, mostre uma mensagem de aviso se a senha começar com a senha confirmada. Se as senhas não corresponderem, mostre uma mensagem de erro.
Resumo
- Use
StringVar
o objeto Tkinter para gerenciar valores de widgets de forma mais eficaz. - Atribua o
StringVar
objeto aotextvariable
widget. - Use o
trace()
método doStringVar
objeto para rastrear as alterações do texto.