python - Atualizar label toda vez que clicar em um botão - Stack Overflow em Português
Atualizar label toda vez que clicar em um botão
Estou usando a biblioteca tkinter para a interface do programa, então, na tela teria um label que começasse com o seu texto representado por uma variável de valor '10', então ao clicar um botão, eu queria que ele somasse 1 à primeira variável, porém ele só faz o desejado na primeira vez.
from tkinter  import *
num = s
lb['text'] = num
def bt_click():
soma(num, 1)
lb = Label(root, text = f'{num}')
lb.place(x = 245, y = 235)
bt = Button(root, text = '+ 1', command = bt_click)
bt.place(x = 175, y = 235)
editada 13/03/20 às 17:55
47,9mil1111 medalhas de ouro4646 medalhas de prata9898 medalhas de bronze
perguntada 13/03/20 às 16:44
L.GabrielL.Gabriel
Se uma das respostas resolveu o seu problema, vc pode escolher a que melhor resolveu e aceitá-la, veja aqui como e porque fazê-lo. Não é obrigatório, mas é uma boa prática do site, para indicar a futuros visitantes que aquilo resolveu o problema. Não esqueça que vc também pode votar em todas as respostas que achou úteis (caso ainda não tenha votado - tb não é obrigatório, mas se vc achou útil, considere votar :-) ) – hkotsubo 13/03/20 às 18:14
Em Python as variáveis ​​referenciadas apenas dentro de uma função são implicitamente globais.
Porém se uma variável tiver um valor atribuído em qualquer lugar do corpo da função, ela será assumida como local, a menos que seja explicitamente declarado como global.
Portanto se quer atribuir valor a uma variável global dentro de um escopo local use a palavra chave global antes de usar a variável.
global num    # informa explicitamente ao interpretador que será utilizado uma variável global dentro desse escopo
num = a + b   # a atribuição agora é feita na variável global.
respondida 13/03/20 às 17:30
Muito obrigado! – L.Gabriel 13/03/20 às 18:12
Essa função soma me parece desnecessária, pois basta você atualizar o conteúdo do botão diretamente:
lb['text'] = int(lb['text']) + 1
Como o texto do botão é uma string, eu uso int para converter seu conteúdo para número, e depois somo 1 e atualizo o texto do botão. Então fica assim:
lb = Label(root, text = '10')
Se quiser muito usar a tal função soma, então daria para fazer assim:
lb['text'] = a + b
soma(int(lb['text']), 1)
Eliminei a variável global porque aparentemente não há motivo para mantê-la (mas caso haja, pode usar a solução da outra resposta para mantê-la atualizada). Também não tem porque jogar a soma em uma variável s, só para depois atribuir s ao label. Se não vai usar s para mais nada, elimine-a e jogue o resultado da soma diretamente no label.
Se bem que a função soma não deveria atualizar o botão, ela deveria somente retornar o resultado da soma e mais nada (e quem chamar a função faz o que precisar com o resultado). Ou seja, algo assim:
lb['text'] = soma(int(lb['text']), 1)
Mas ainda acho exagero para esse caso específico, e eu ficaria com a primeira solução que sugeri, que não usa a função soma. Claro que se for fazer várias outras coisas mais complexas, aí vale a pena quebrar em funções menores. Mas para o seu caso específico, acho que não precisa.
respondida 13/03/20 às 17:52
Isso acontece pois, dentro do seu método, a variável num não é a mesma que a que você declarou. pense que a num dentro do método apenas o método pode ver. Para conseguir esse valor, você deve retornar ele, dessa maneira:
e para receber esse número, na chamada do método, use:
num = soma(num, 1)
respondida 13/03/20 às 17:06
Vitor CeolinVitor Ceolin
4061717 medalhas de bronze
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag python tkinter ou faça sua própria pergunta.