#python #tkinter
#python #tkinter
Вопрос:
Итак, у меня есть этот небольшой проект с камнем, бумагой и ножницами для обучения (в частности, с использованием Tkinter для создания графического интерфейса), и я застрял со счетчиком. Я уже проверил в терминале Python, что счетчик работает, но он не обновляет метку, поэтому счетчик застрял в 0 в интерфейсе. Я перепробовал все и искал другие программы, подобные моей, и они делали то же самое, я просто не знаю, что делать. Может ли кто-нибудь решить это для меня? (Код немного перегружен, извините за это. Также некоторые тексты на португальском, но я думаю, что это действительно не имеет значения.)
from tkinter import
import random
from PIL import ImageTk, Image
counterv = 0 #**
counterd = 0 #**
# Inicialization
root = Tk()
root.title('Pedra, Papel, Tesoura')
root.iconbitmap('c:/imagens/pedraico.ico')
# Bot List
lista_ppt = ['Pedra', 'Papel', 'Tesoura']
# Comandos externos
counterv_label = Label(root, text=f'Vitórias: **{counterv}** ', bg='blue', anchor=W)
counterd_label = Label(root, text=f'Derrota: **{counterd}** ', bg='red', anchor=E)
# Creating images
inicio_img = ImageTk.PhotoImage(Image.open('c:/imagens/ppt_imagem.png'))
pedra_img = ImageTk.PhotoImage(Image.open('c:/imagens/pedra_.png'))
papel_img = ImageTk.PhotoImage(Image.open('c:/imagens/papel_.png'))
tesoura_img = ImageTk.PhotoImage(Image.open('c:/imagens/tesoura_.png'))
pedrabot_img = ImageTk.PhotoImage(Image.open('c:/imagens/pedrabot.png'))
papelbot_img = ImageTk.PhotoImage(Image.open('c:/imagens/papelbot.png'))
tesourabot_img = ImageTk.PhotoImage(Image.open('c:/imagens/tesourabot.png'))
# Creating labels
pedra_tela = Label(image=pedra_img)
papel_tela = Label(image=papel_img)
tesoura_tela = Label(image=tesoura_img)
pedrabot_tela = Label(image=pedrabot_img)
papelbot_tela = Label(image=papelbot_img)
tesourabot_tela = Label(image=tesourabot_img)
empate = Label(root, text='Empate')
vitoria = Label(root, text='Vitória.')
derrota = Label(root, text='Derrota')
imagem_inicial = Label(image=inicio_img)
indicador = Label(root, text='<- Você - - Bot ->')
# Defining
def b_pedra():
global bot
global counterv #**
global counterd #**
bot = random.choice(lista_ppt)
pedra_tela.grid_forget()
papel_tela.grid_forget()
tesoura_tela.grid_forget()
imagem_inicial.grid_forget()
empate.grid_forget()
derrota.grid_forget()
vitoria.grid_forget()
indicador.grid_forget()
indicador.grid(row=1, column=1)
pedrabot_tela.grid_forget()
papelbot_tela.grid_forget()
tesourabot_tela.grid_forget()
if bot == 'Pedra':
pedra_tela.grid(row=1, column=0)
pedrabot_tela.grid(row=1, column=2)
empate.grid(row=3, column=0, columnspan=3)
elif bot == 'Papel':
pedra_tela.grid(row=1, column=0)
papel_tela.grid(row=1, column=2)
derrota.grid(row=3, column=0, columnspan=3)
counterd = 1 #**
elif bot == 'Tesoura':
pedra_tela.grid(row=1, column=0)
tesoura_tela.grid(row=1, column=2)
vitoria.grid(row=3, column=0, columnspan=3)
counterv = 1 #**
counterv_label.grid_forget() #**
counterd_label.grid_forget()
counterv_label.grid(row=4, column=0)
counterd_label.grid(row=4, column=2)
def b_papel():
global bot
global counterv #**
global counterd #**
bot = random.choice(lista_ppt)
pedra_tela.grid_forget()
papel_tela.grid_forget()
tesoura_tela.grid_forget()
imagem_inicial.grid_forget()
empate.grid_forget()
derrota.grid_forget()
vitoria.grid_forget()
indicador.grid_forget()
indicador.grid(row=1, column=1)
pedrabot_tela.grid_forget()
papelbot_tela.grid_forget()
tesourabot_tela.grid_forget()
if bot == 'Pedra':
papel_tela.grid(row=1, column=0)
pedra_tela.grid(row=1, column=2)
vitoria.grid(row=3, column=0, columnspan=3)
counterv = 1 #**
elif bot == 'Papel':
papel_tela.grid(row=1, column=0)
papelbot_tela.grid(row=1, column=2)
empate.grid(row=3, column=0, columnspan=3)
elif bot == 'Tesoura':
papel_tela.grid(row=1, column=0)
tesoura_tela.grid(row=1, column=2)
derrota.grid(row=3, column=0, columnspan=3)
counterd = 1 #**
counterv_label.grid_forget() #**
counterd_label.grid_forget()
counterv_label.grid(row=4, column=0)
counterd_label.grid(row=4, column=2)
def b_tesoura():
global bot
global counterv #**
global counterd #**
bot = random.choice(lista_ppt)
pedra_tela.grid_forget()
papel_tela.grid_forget()
tesoura_tela.grid_forget()
imagem_inicial.grid_forget()
empate.grid_forget()
derrota.grid_forget()
vitoria.grid_forget()
indicador.grid_forget()
indicador.grid(row=1, column=1)
pedrabot_tela.grid_forget()
papelbot_tela.grid_forget()
tesourabot_tela.grid_forget()
if bot == 'Pedra':
tesoura_tela.grid(row=1, column=0)
pedra_tela.grid(row=1, column=2)
derrota.grid(row=3, column=0, columnspan=3)
counterd = 1 #**
elif bot == 'Papel':
tesoura_tela.grid(row=1, column=0)
papel_tela.grid(row=1, column=2)
vitoria.grid(row=3, column=0, columnspan=3)
counterv = 1 #**
elif bot == 'Tesoura':
tesoura_tela.grid(row=1, column=0)
tesourabot_tela.grid(row=1, column=2)
empate.grid(row=3, column=0, columnspan=3)
counterv_label.grid_forget() #**
counterd_label.grid_forget()
counterv_label.grid(row=4, column=0)
counter_label.grid(row=4, column=2)
# Buttons
pedra = Button(root, text='Pedra', padx=40, pady=20, borderwidth=5, command=b_pedra)
papel = Button(root, text='Papel', padx=40, pady=20, borderwidth=5, command=b_papel)
tesoura = Button(root, text='Tesoura', padx=40, pady=20, borderwidth=5, command=b_tesoura)
pedra.grid(row=2, column=0)
papel.grid(row=2, column=1)
tesoura.grid(row=2, column=2)
imagem_inicial.grid(row=0, column=0, columnspan=3)
root.mainloop()
Комментарии:
1. Эти звездочки должны показывать, куда я помещаю счетчик
2. Вам необходимо обновлять текст в метках после каждого обновления счетчиков.
3. Я предлагаю вам удалить звездочки, которые вы поставили, и оставить их в качестве комментария, потому что их удаление для тестирования раздражает. Во-вторых, я не вижу, что вы определили
counter_label
в своем коде, пожалуйста, обновите то же самое.
Ответ №1:
Добро пожаловать в Stack Overflow.
Причина, по которой метки не обновляются, заключается в том, что им были присвоены фиксированные значения во время инициализации. Чтобы обновить значения меток, у вас есть несколько вариантов:
- Прикрепите
textvariable
к метке и обновите ее значение позже, как уже упоминалось @Mahendra Suthar, или используйте.update()
метод для меток. - Вы можете использовать
.configure
метод для задания значения текста с помощьюlabel.configure(text = 'Updated_text')
илиlabel['text'] = 'Updated_text'
.
Вот рабочий образец вашего кода (я изменил изображения на текст из-за недоступности того же)
from tkinter import *
import random
from PIL import ImageTk, Image
counterv = 0
counterd = 0
# Inicialization
root = Tk()
root.title('Pedra, Papel, Tesoura')
#root.iconbitmap('c:/imagens/pedraico.ico')
# Bot List
lista_ppt = ['Pedra', 'Papel', 'Tesoura']
# Comandos externos
counterv_label = Label(root, text = f'Vitórias: {counterv} ', bg='blue', anchor=W)
counterd_label = Label(root, text = f'Derrota: {counterd} ', bg='red', anchor=E)
counterv_label.grid(row=4, column=0)
counterd_label.grid(row=4, column=2)
'''
# Creating images
inicio_img = ImageTk.PhotoImage(Image.open('c:/imagens/ppt_imagem.png'))
pedra_img = ImageTk.PhotoImage(Image.open('c:/imagens/pedra_.png'))
papel_img = ImageTk.PhotoImage(Image.open('c:/imagens/papel_.png'))
tesoura_img = ImageTk.PhotoImage(Image.open('c:/imagens/tesoura_.png'))
pedrabot_img = ImageTk.PhotoImage(Image.open('c:/imagens/pedrabot.png'))
papelbot_img = ImageTk.PhotoImage(Image.open('c:/imagens/papelbot.png'))
tesourabot_img = ImageTk.PhotoImage(Image.open('c:/imagens/tesourabot.png'))
'''
# Creating labels
pedra_tela = Label(text = 'Pedra')
papel_tela = Label(text = 'Papel')
tesoura_tela = Label(text = 'Tesoura')
pedrabot_tela = Label(text = 'Pedra Bot')
papelbot_tela = Label(text = 'Papel Bot')
tesourabot_tela = Label(text = 'Tesoura Bot')
empate = Label(root, text='Empate')
vitoria = Label(root, text='Vitória.')
derrota = Label(root, text='Derrota')
imagem_inicial = Label(text='Inicio')
indicador = Label(root, text='<- Você - - Bot ->')
# Defining
def b_pedra():
global bot
global counterv
global counterd
bot = random.choice(lista_ppt)
pedra_tela.grid_forget()
papel_tela.grid_forget()
tesoura_tela.grid_forget()
imagem_inicial.grid_forget()
empate.grid_forget()
derrota.grid_forget()
vitoria.grid_forget()
indicador.grid_forget()
indicador.grid(row=1, column=1)
pedrabot_tela.grid_forget()
papelbot_tela.grid_forget()
tesourabot_tela.grid_forget()
if bot == 'Pedra':
pedra_tela.grid(row=1, column=0)
pedrabot_tela.grid(row=1, column=2)
empate.grid(row=3, column=0, columnspan=3)
elif bot == 'Papel':
pedra_tela.grid(row=1, column=0)
papel_tela.grid(row=1, column=2)
derrota.grid(row=3, column=0, columnspan=3)
counterd = 1
elif bot == 'Tesoura':
pedra_tela.grid(row=1, column=0)
tesoura_tela.grid(row=1, column=2)
vitoria.grid(row=3, column=0, columnspan=3)
counterv = 1
counterv_label.configure(text = f'Vitórias: {counterv} ')
counterd_label.configure(text = f'Derrota: {counterd} ')
def b_papel():
global bot
global counterv
global counterd
bot = random.choice(lista_ppt)
pedra_tela.grid_forget()
papel_tela.grid_forget()
tesoura_tela.grid_forget()
imagem_inicial.grid_forget()
empate.grid_forget()
derrota.grid_forget()
vitoria.grid_forget()
indicador.grid_forget()
indicador.grid(row=1, column=1)
pedrabot_tela.grid_forget()
papelbot_tela.grid_forget()
tesourabot_tela.grid_forget()
if bot == 'Pedra':
papel_tela.grid(row=1, column=0)
pedra_tela.grid(row=1, column=2)
vitoria.grid(row=3, column=0, columnspan=3)
counterv = 1
elif bot == 'Papel':
papel_tela.grid(row=1, column=0)
papelbot_tela.grid(row=1, column=2)
empate.grid(row=3, column=0, columnspan=3)
elif bot == 'Tesoura':
papel_tela.grid(row=1, column=0)
tesoura_tela.grid(row=1, column=2)
derrota.grid(row=3, column=0, columnspan=3)
counterd = 1
counterv_label.configure(text = f'Vitórias: {counterv} ')
counterd_label.configure(text = f'Derrota: {counterd} ')
def b_tesoura():
global bot
global counterv
global counterd
bot = random.choice(lista_ppt)
pedra_tela.grid_forget()
papel_tela.grid_forget()
tesoura_tela.grid_forget()
imagem_inicial.grid_forget()
empate.grid_forget()
derrota.grid_forget()
vitoria.grid_forget()
indicador.grid_forget()
indicador.grid(row=1, column=1)
pedrabot_tela.grid_forget()
papelbot_tela.grid_forget()
tesourabot_tela.grid_forget()
if bot == 'Pedra':
tesoura_tela.grid(row=1, column=0)
pedra_tela.grid(row=1, column=2)
derrota.grid(row=3, column=0, columnspan=3)
counterd = 1
elif bot == 'Papel':
tesoura_tela.grid(row=1, column=0)
papel_tela.grid(row=1, column=2)
vitoria.grid(row=3, column=0, columnspan=3)
counterv = 1
elif bot == 'Tesoura':
tesoura_tela.grid(row=1, column=0)
tesourabot_tela.grid(row=1, column=2)
empate.grid(row=3, column=0, columnspan=3)
counterv_label.configure(text = f'Vitórias: {counterv} ')
counterd_label.configure(text = f'Derrota: {counterd} ')
# Buttons
pedra = Button(root, text='Pedra', padx=40, pady=20, borderwidth=5, command=b_pedra)
papel = Button(root, text='Papel', padx=40, pady=20, borderwidth=5, command=b_papel)
tesoura = Button(root, text='Tesoura', padx=40, pady=20, borderwidth=5, command=b_tesoura)
pedra.grid(row=2, column=0)
papel.grid(row=2, column=1)
tesoura.grid(row=2, column=2)
imagem_inicial.grid(row=0, column=0, columnspan=3)
root.mainloop()
Комментарии:
1. Большое вам спасибо и извините за ошибки новичков, я уже проверил, и это работает отлично. Спасибо всем, кто также помог мне!
2. @GustavoGodoy Я был бы очень признателен, если бы вы отметили это как ответ, если это решило вашу проблему, чтобы этот вопрос считался решенным. Пожалуйста, обратитесь к как работает принятие ответа
3. Извините за это, я впервые пользуюсь этим сайтом. Я думаю, что я принял это как ответ. Еще раз спасибо!
Ответ №2:
Ваша метка не обновляется, поскольку вы не подключили ее к какому-либо тексту, что означает, что она не знает, какой текст отображать при изменении. Вы можете использовать StringVar() что он делает, так это автоматически обновляет метку при изменении текста.
counter = tk.StringVar()
counter.set("0")
label = tk.Label(root, textvariable=counter)
поэтому всякий раз, когда вызывается counter.set, метка автоматически обновляется новым значением счетчика.
Когда вы инициализируете свою метку, вы можете предоставить аргумент textvariable, который используется для текста, отображаемого label всякий раз, когда он изменяется, Tkinter автоматически обновляет его для нас.
вы можете прочитать больше здесь, как изменить / обновить метку Tkinter
Комментарии:
1. необязательно прикреплять ярлык с помощью
StringVar()
, вы также можете использоватьlabel.configure(text = counter)
илиlabel['Text'] = counter
для того же.2. Большое спасибо за помощь!