Камень, ножницы, бумага — Python (Tkinter)

#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.

Причина, по которой метки не обновляются, заключается в том, что им были присвоены фиксированные значения во время инициализации. Чтобы обновить значения меток, у вас есть несколько вариантов:

  1. Прикрепите textvariable к метке и обновите ее значение позже, как уже упоминалось @Mahendra Suthar, или используйте .update() метод для меток.
  2. Вы можете использовать .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. Большое спасибо за помощь!