Палач не может обновлять изображения одно за другим

from tkinter import *
from tkinter import messagebox
import random


class homewindow(object):
    def __init__(self,win):
        self.words = ['rainbow','geography','testimonial','science','effort','amusing']
        self.hidden_wd = random.choice(self.words)
        self.words.remove(self.hidden_wd)
        self.photo_list = [PhotoImage(file='1.gif'),
                      PhotoImage(file='2.gif'),PhotoImage(file='3.gif'),
                      PhotoImage(file='4.gif'),PhotoImage(file='5.gif'),
                      PhotoImage(file='6.gif'),PhotoImage(file='7.gif'),
                      PhotoImage(file='8.gif'),PhotoImage(file='9.gif'),PhotoImage(file='10.gif')]

        self.hidden_wd = self.hidden_wd.strip()
        print(self.hidden_wd)

        self.guess_list = []
        self.times = 9
        self.wrong = 0
        
        self.win = win
        self.win.title('Hangman')
        self.win.geometry('600x400')
        self.lb1 = Label(win,image=self.photo_list[0])
        self.lb1.image = self.photo_list[0]
        self.lb1.grid(row=0,rowspan=3,column=0)
        self.lb2 = Label(win,text='_'*len(self.hidden_wd))
        self.lb2.grid(row=0,column=1,columnspan=3)
        self.lb3 = Label(win,text='You have '+ str(self.times) + ' left')
        self.lb3.grid(row=4,column=1,columnspan=3)
        self.e = Label(win,text='Enter letter: ')
        self.e.grid(row=1,column=1,columnspan=3)
        self.display_word()
        self.display_guess()
        self.guess_input()

    def letter_guess(self,letter):
        self.data = self.entry.get()
        self.guess_list += self.data
        if self.data not in self.hidden_wd:
            self.times -= 1
            if self.times == 0:
                messagebox.showwarning('Lose','Game Over')
        self.display_word()
        self.display_guess()

    def display_word(self):
        self.guessed = ''
        for i in self.hidden_wd.lower():
            if i in self.guess_list:
                self.guessed += i
            elif i not in self.guess_list:
                self.guessed += '*'
                self.wrong += 1
        self.lb1.configure(image=self.photo_list[self.wrong])
        self.lb2.configure(text=self.guessed)
        if '*' not in self.guessed:
            messagebox.showinfo('Hangmaner','Congraulations')

    def display_guess(self):
        self.wrong_guess = []
        for i in self.guess_list:
            if i not in self.hidden_wd.lower():
                self.wrong_guess += i
        Label(self.win,text=self.wrong_guess).grid(row=5,column=1)
                
                
    def guess_input(self):
        self.var = StringVar()
        self.entry = Entry(self.win,textvariable=self.var)
        self.entry.bind('<Return>',self.letter_guess)
        self.entry.grid(row=2,column=1,columnspan=3)
        
if __name__ == '__main__':
    HangMan = Tk()
    hm = homewindow(HangMan)
    HangMan.mainloop()
        

Error:
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "E:\Python\Python Projects Fun\hangman\hangman_code.py", line 49, in letter_guess
    self.display_word()
  File "E:\Python\Python Projects Fun\hangman\hangman_code.py", line 60, in display_word
    self.lb1.configure(image=self.photo_list[self.wrong])
IndexError: list index out of range

Я установил self.wrong = 0 в начале, и моя цель - обновить изображение до следующего, если я угадываю неправильную букву. Я столько раз пробовал, но это сообщение об ошибке все равно появляется. Я уже установил, что если игрок ошибается, тогда self.wrong + = 1. Тогда переменная self.wrong должна быть целым числом, поэтому я не понимаю, почему self.photo_list [self.wrong] будет иметь ошибку индекса? Я уже указал self.photo_list [index], и индекс является целым числом. Может ли кто-нибудь помочь мне исправить указанную выше ошибку?


person Dominic Sham    schedule 30.07.2020    source источник
comment
Вам нужно сбросить self.wrong в начале display_word().   -  person acw1668    schedule 30.07.2020
comment
Одно из скрытых слов testimonial длиной ›10.   -  person acw1668    schedule 30.07.2020
comment
Где слово "отзыв"?   -  person Dominic Sham    schedule 30.07.2020
comment
Я сбрасываю self.wrong = 0 после def display_word, но все еще indexerror   -  person Dominic Sham    schedule 30.07.2020
comment
testimonial в self.words длиной 11 символов. Если выбрано это слово, self.wrong будет 11, но есть только 10 изображений в self.photo_list (индекс 0–9). Это вызовет ошибку.   -  person acw1668    schedule 30.07.2020
comment
Я изменил, но вначале используется последняя картинка вместо первой. Я бы хотел сделать наоборот   -  person Dominic Sham    schedule 30.07.2020
comment
Какова цель изображения числа? Показано количество совпадающих букв?   -  person acw1668    schedule 30.07.2020
comment
Я хотел бы установить, если игрок ошибочно угадает, список изображений переходит к следующему.   -  person Dominic Sham    schedule 30.07.2020
comment
Вы имеете в виду, что это количество ошибочных предположений?   -  person acw1668    schedule 30.07.2020
comment
Мой photo_list, установленный в начале, - это photo_list [0], и когда я запускаю, он появляется в соответствии с длиной слова, а не строит палача при неправильном угадывании   -  person Dominic Sham    schedule 30.07.2020
comment
Вы понимаете, о чем я спрашиваю? Изображение показывает количество ошибочных предположений?   -  person acw1668    schedule 30.07.2020
comment
Да, и я не знаю, как изменить, если я хочу, чтобы картинка сменилась на следующую, если игрок угадает неправильно   -  person Dominic Sham    schedule 30.07.2020
comment
Тогда не обновляйте self.wrong внутри display_word(). Обновите self.wrong внутри letter_guess().   -  person acw1668    schedule 30.07.2020
comment
Теперь, когда я угадываю неправильную букву, только первый раз переключается на следующую картинку и не работает после второй неправильной. Итак, как я могу сделать петлю?   -  person Dominic Sham    schedule 30.07.2020
comment
Так куда же мне поместить photo_image [self.wrong], чтобы обновлять одно за другим?   -  person Dominic Sham    schedule 30.07.2020


Ответы (1)


Если self.wrong - это количество ошибочных предположений, то его следует обновить внутри letter_guess, а не в display_word():

def letter_guess(self,letter):
    self.data = self.entry.get()
    self.guess_list += self.data
    if self.data not in self.hidden_wd:
        self.wrong += 1  # increment self.wrong
        self.times -= 1
        if self.times == 0:
            messagebox.showwarning('Lose','Game Over')
    self.display_word()
    self.display_guess()

def display_word(self):
    self.guessed = ''
    for i in self.hidden_wd.lower():
        if i in self.guess_list:
            self.guessed += i
        else:
            self.guessed += '*'
            # removed self.wrong += 1
    self.lb1.configure(image=self.photo_list[self.wrong])
    self.lb2.configure(text=self.guessed)
    if '*' not in self.guessed:
        messagebox.showinfo('Hangmaner','Congraulations')
person acw1668    schedule 30.07.2020