Enviar um café pro programador

Label como saída - StringVar

Neste tutorial de nosso Curso de Python, vamos aprender a usar a classe StringVar, que nos permite criar labels dinâmicas, que usaremos como saída de dados.

Python Progressivo em PDF: Apostila de Pyhon

Label como saída de dados dinâmica

Até o momento, em nossos estudos em programação gráfica, viemos usando as caixas de diálogo para exibir alguma informação, uma saída de dados, como uma simples string.

Porém, não é isso que ocorre na prática, não fica sempre pipocando janelinhas, até porque isso é chato. É normal que, você insira um dado, aperte um botão ou não, e automaticamente já apareça uma informação na janela mesmo, sem nenhuma nova janela surgindo.

É como se fosse uma espécie de label dinâmica. Inicialmente ela mostra:

Seu IMC é:

Então você informa seu peso e altura, e esse label se transforma;
Seu IMC é: 26, você está com sobrepeso

Essa mudança deve ocorrer simplesmente clicando em algum botão.

Vamos aprender como fazer isso?

Como usar StringVar

Vamos criar o seguinte programa:

Label como saída de dados dinâmica

Digitamos nosso nome, clicamos em Exibe e aparece o label embaixo: "Seu nome é: ..."

Esse programa é composto por três frames:

  1. Frame de cima: tem o label "Digite seu nome" e o campo de entrada
  2. Frame do meio: tem o label "Seu nome é:" e o label dinâmico (StringVar), que exibe o nome que o usuário digitou no campo de entrada
  3. Frame de baixo: dois botões, o Exibe e o Sair
O primeiro e o último frame, bem como seus widgets internos, sabemos muito bem como criar e trabalhar com eles.

Vamos focar no frame do meio, que tem a label dinâmica.

O segredo aqui é criar um objeto do tipo StringVar(), vamos chamar de label_dinamica.
Ela que vai ficar 'pegando' o que é digitado no campo de entrada. Mas ela pega e passa pra outra label, a label3.

A label3 recebe um parâmetro chamado textvariable, que como o nome diz, vai receber um texto variável. Como argumento, passamos o nome do label dinâmica, que no nosso caso é label_dinamica.

O código fica assim:
self.label3 = Label(self.frame_meio, textvariable=self.label_dinamica)


Ou seja, essa linha de código quer dizer: crie uma label de nome label3, que vai ficar no frame_meio e o valor que ela vai exibir é um texto variável, que a label_dinamica vai ficar pegando).

Essa label dinâmica vai pegar o valor escrito na entrada, quando clicamos no botão Exibe.
Quando isso ocorre, esse botão chama o método exibe()

Dentro desse método, pegamos o valor que foi digitado e armazenamos na variável nome da seguinte maneira:
nome = self.entrada.get()

Agora, vamos passar essa variável para a label dinâmica, através do método set() que ela tem, que recebe uma string:
self.label_dinamica.set(nome)

Veja como fica nosso código Python:

from tkinter import *

class MinhaGUI:
 def __init__(self):
  # Cria janela principal
  self.janela_principal = Tk()
  
  # Cria três frames
  self.frame_cima = Frame(self.janela_principal)
  self.frame_meio = Frame(self.janela_principal)
  self.frame_baixo = Frame(self.janela_principal)
  
  # No frame de cima, um label e uma entry
  self.label1 = Label(self.frame_cima, text='Digite seu nome: ')
  self.entrada = Entry(self.frame_cima, width = 30)
  
  # Empacotando o label e entrada no primeiro frame
  self.label1.pack(side='left')
  self.entrada.pack(side='left')
  
  # Labels do frame do meio
  self.label2 = Label(self.frame_meio, text='Seu nome é:  ')
  self.label_dinamica = StringVar()
  self.label3 = Label(self.frame_meio, textvariable=self.label_dinamica)
  
  # Empacotando as labels do meio
  self.label2.pack(side='left')
  self.label3.pack(side='left')
  
  # Criando os botões
  self.botao = Button(self.frame_baixo, text='Exibe', command=self.exibe)
  self.botao_sair = Button(self.frame_baixo, text='Sair', command=self.janela_principal.quit)
  
  # Empacotando botões e label
  self.botao.pack(side='left')
  self.botao_sair.pack(side='left')
  
  # Empacotando os frames na janela principal
  self.frame_cima.pack()
  self.frame_meio.pack()
  self.frame_baixo.pack()
  
  # Rodando
  mainloop()
  
 def exibe(self):
   nome = self.entrada.get()
   self.label_dinamica.set(nome)
   
  
gui = MinhaGUI()

Rode ele! Leia linha por linha e tente entender tudo que está se passando aí.

5 comentários: