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], и индекс является целым числом. Может ли кто-нибудь помочь мне исправить указанную выше ошибку?
self.wrong
в началеdisplay_word()
. - person acw1668   schedule 30.07.2020testimonial
длиной ›10. - person acw1668   schedule 30.07.2020testimonial
вself.words
длиной 11 символов. Если выбрано это слово,self.wrong
будет 11, но есть только 10 изображений вself.photo_list
(индекс 0–9). Это вызовет ошибку. - person acw1668   schedule 30.07.2020self.wrong
внутриdisplay_word()
. Обновитеself.wrong
внутриletter_guess()
. - person acw1668   schedule 30.07.2020