StringVar do Tkinter

Resumo : neste tutorial você aprenderá sobre o StringVarobjeto Tkinter e como usá-lo para manipular valores de widgets.

Introdução ao Tkinter StringVar

O Tkinter StringVarajuda você a gerenciar o valor de um widget como um Labelou Entryde forma mais eficaz.

Para criar um novo StringVarobjeto, você usa o StringVarconstrutor assim:

string_var = tk.StringVar(container, value, name)Linguagem de código:  Python  ( python )

O StringVarconstrutor aceita três argumentos opcionais:

  • containeré um widget ao qual o StringVarobjeto 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 é, por PY_VARnumexemplo PY_VAR1, PY_VAR2, , etc.

Depois de criar o StringVarobjeto, você pode atribuí-lo a textvariableum widget que aceita um StringVarobjeto.

Por exemplo, o seguinte atribui o string_varto textvariabledo Entrywidget:

name_entry = ttk.Entry(root, textvariable=string_var)Linguagem de código:  Python  ( python )

Para obter o valor atual do Entrywidget, você pode usar o get()método do StringVarobjeto:

name_var.get()Linguagem de código:  Python  ( python )

O StringVarobjeto irá notificá-lo sempre que seu valor mudar. Este recurso é útil se você deseja atualizar automaticamente outros widgets com base no valor atual do StringVarobjeto.

Para invocar um retorno de chamada sempre que o valor de um StringVarobjeto for alterado, você usa o trace()método do StringVarobjeto:

string_var.trace('w', callback)Linguagem de código:  Python  ( python )

O 'w'modo invocará automaticamente callbacksempre que o valor do valor for string_varalterado.

O StringVartambé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 StringVarobjeto para um Entrywidget:

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 StringVarobjeto no __init__()método da Appclasse:

self.name_var = tk.StringVar()Linguagem de código:  Python  ( python )

Segundo, atribua o StringVarobjeto à textvariableopção do Entrywidget 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_labelwidget para o valor do name_varobjeto 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 StringVarobjeto para rastrear alterações de texto.

A janela raiz possui dois Entrywidgets: 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:

Demonstração Tkinter StringVar
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 ERRORe SUCCESSque serão definidas com message_labelbase no resultado da validação:

ERROR = 'Error.TLabel'
SUCCESS = 'Success.TLabel'
WARNING = 'Warning.TLabel'Linguagem de código:  Python  ( python )

Segundo, crie dois StringVarobjetos:

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 StringVaro objeto Tkinter para gerenciar valores de widgets de forma mais eficaz.
  • Atribua o StringVarobjeto ao textvariablewidget.
  • Use o trace()método do StringVarobjeto para rastrear as alterações do texto.

Deixe um comentário

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