Duvida - Set Label em Tkinter

1,014 views
Skip to first unread message

Flaybson Diniz

unread,
Feb 26, 2013, 7:17:39 AM2/26/13
to python...@googlegroups.com
Olá gente, em meus estudo me apareceu um probleminha,
criei uma função para usar em um botão pra trocar um texto em Label mais não ta funcionando alguem me da uma luz por favor.

Segue o link do Git e o codigo abaixo.
https://github.com/flaybsondiniz/estudando-tkinter/blob/master/TKsetMSG

import tkinter
from tkinter import *


app = tkinter.Tk()
novo = StringVar('')

frame = tkinter.Frame(app, relief=RIDGE, borderwidth=2)
frame.pack(fill=BOTH,expand=1)

msg =''
texto=('Testando')

def trocar_texto(texto):
    texto = novo
    return novo

label = tkinter.Label(app, text=texto)
label.pack()

button = tkinter.Button(app,text = 'click',command = trocar_texto(novo))
button.pack()

sair = tkinter.Button(app,text = 'Sair',command =app.destroy)
sair.pack(side=BOTTOM)

app.mainloop()

Antonio Ribeiro

unread,
Feb 26, 2013, 7:50:27 AM2/26/13
to python...@googlegroups.com
Eu notei dois principais erros:

1 - como passar um callback para um botão:

Quando vc deseja passar um callback, como neste caso:

button = tkinter.Button(app,text = 'click',command = trocar_texto(novo))
você não pode chamar a função. Por exemplo, faz de conta que quando você clicar no botão vc quer que a função blah seja invocada:

def blah():
   print "oi"

button = tkinter.Button(app,text = 'click', command=blah) # note que não é command=blah()


O motivo é: você não quer chamar a função agora, mas sim passar a função como argumento para que ela seja chamada futuramente.


2 - Você está usando StringVar de forma errada

A idéia de usar uma StringVar é mudar dinamicamente o seu conteúdo sem ter que a cessar o Widget diretamente.
O que você tem que fazer é criar uma StringVar, setar o seu conteúdo e criar um botão/label/whatever passando essa StringVar como argumento. Quando você quiser mudar o texto do botão/label/whatever, vc modifica o conteúdo da StringVar.

Porém, quando for instanciar um Widget em Tkinter usando StringVar, você deve passa-la como textvariable, e não como text:

label = tkinter.Label(app, text=texto)

vira

label = tkinter.Label(app, textvariable=sv) # sv é sua instância de StringVar


Dá uma olhada no seu código com algumas modificações aqui: https://gist.github.com/alvesjnr/5038127




2013/2/26 Flaybson Diniz <flaybso...@hotmail.com>
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
Atenciosamente,
Antonio Ribeiro

Skype: alvesjnr

Flaybson Diniz

unread,
Feb 26, 2013, 8:33:48 AM2/26/13
to python...@googlegroups.com
Antonio,
Vlw a solução mesmo foi o textvariable.
Obrigadão.
Reply all
Reply to author
Forward
0 new messages