#python #python-3.x #tkinter #error-handling
#python #python-3.x #tkinter #обработка ошибок
Вопрос:
Я создаю программу «hangman» на python, она следует тому же принципу, что и «Hangman», каждый раз, когда вы получаете что-то не так, это добавляет что-то к stick person, моя программа работает до конца, потому что я еще не закончил, но основы есть. Изображение отображается, и у пользователя 8 неправильных попыток (в этой части все идет не так), изображение отображается, и когда я тестировал с помощью операторов печати, чтобы проверить, работают ли переменные, они будут работать, и изображение отобразится, но после этого появится это сообщение об ошибке, и я не могу показатьсячтобы понять, почему. Я использую python 3.8 и последнюю версию библиотеки tkinter. Есть ли кто-нибудь, кто может мне помочь в этом?
сообщение об ошибке:
Exception in Tkinter callback
Traceback (most recent call last):
File "E:Pythonlibtkinter__init__.py", line 1883, in __call__
return self.func(*args)
File "C:/Users/James/Desktop/CollegeComputer Science/HangManGUI.py", line 248, in whenPressed
canvas.config(canvas.create_image(250,250,image=img))
File "E:Pythonlibtkinter__init__.py", line 1637, in configure
return self._configure('configure', cnf, kw)
File "E:Pythonlibtkinter__init__.py", line 1622, in _configure
cnf = _cnfmerge(cnf)
File "E:Pythonlibtkinter__init__.py", line 109, in _cnfmerge
for c in _flatten(cnfs):
TypeError: object of type 'int' has no len()
Код:
import time
from tkinter import *
from PIL import ImageTk, Image
import random
foodWords = ["CHOCOLATE", "PIZZA", "SAUSAGE", "BEEF", "CHICKEN"]
sportsWords = ["RUGBY", "FOOTBALL", "CRICKET", "BASEBALL", "BASKETBALL"]
placesWords = ["OLDHAM", "MANCHESTER", "LONDON", "BIRMINGHAM", "LEEDS", "BLACKPOOL", "NEWCASTLE"]
usersGuessList = []
usersGuesses = []
def foodgameSettings():
global secretWordList
global secretWord
global genre
global secretWord
global baseattempts
genre = foodWords
secretWord = random.choice(genre)
secretWordList = list(secretWord)
baseattempts = 8
foodGame()
def sportsgameSettings():
global secretWordList
global secretWord
global genre
global secretWord
global baseattempts
genre = sportsWords
secretWord = random.choice(genre)
secretWordList = list(secretWord)
baseattempts = 8
sportsGame()
def placesgameSettings():
global secretWordList
global secretWord
global genre
global secretWord
global baseattempts
genre = placesWords
secretWord = random.choice(genre)
secretWordList = list(secretWord)
baseattempts = 8
placesGame()
def placesGame():
global genre
global secretWordList
global secretWord
global genre
global secretWord
global usersGuessList
global usersGuesses
global usersGuessList
global usersGuesses
global entry
global guess
global placesgamewind
global label
global canvas
global baseattempts
global status
global widget
def printGuessedLetter():
print("The word is " ''.join(usersGuessList))
for n in secretWordList:
usersGuessList.append('_')
printGuessedLetter()
placesgamewind = Tk()
genrepicker.destroy()
widget = placesgamewind
placesgamewind.title("Hangman")
canvas = Canvas(height="500",width="500")
canvas.pack()
Label(placesgamewind,text="Your word:").pack()
Label(placesgamewind, text="Has this many letters = " str(len(secretWordList))).pack()
label = Label(placesgamewind,text=usersGuessList)
label.pack()
status = Label(placesgamewind, text="Guess a letter")
status.pack()
guess = StringVar(placesgamewind)
entry = Entry(placesgamewind, textvariable=guess)
submitbtn = Button(placesgamewind, command=whenPressed, text="Submit")
entry.pack()
submitbtn.pack()
placesgamewind.mainloop()
def sportsGame():
global genre
global secretWordList
global secretWord
global genre
global secretWord
global usersGuessList
global usersGuesses
global usersGuessList
global usersGuesses
global entry
global guess
global sportsgamewind
global label
global canvas
global baseattempts
global status
global widget
def printGuessedLetter():
print("The word is " ''.join(usersGuessList))
for n in secretWordList:
usersGuessList.append('_')
printGuessedLetter()
sportsgamewind = Tk()
genrepicker.destroy()
widget = sportsgamewind
sportsgamewind.title("Hangman")
canvas = Canvas(height="500",width="500")
canvas.pack()
Label(sportsgamewind,text="Your word:").pack()
Label(sportsgamewind, text="Has this many letters = " str(len(secretWordList))).pack()
label = Label(sportsgamewind,text=usersGuessList)
label.pack()
status = Label(sportsgamewind, text="Guess a letter")
status.pack()
guess = StringVar(sportsgamewind)
entry = Entry(sportsgamewind, textvariable=guess)
submitbtn = Button(sportsgamewind, command=whenPressed, text="Submit")
entry.pack()
submitbtn.pack()
sportsgamewind.mainloop()
def foodGame():
global genre
global secretWordList
global secretWord
global genre
global secretWord
global usersGuessList
global usersGuesses
global usersGuessList
global usersGuesses
global entry
global guess
global foodgamewind
global label
global canvas
global baseattempts
global status
global widget
def printGuessedLetter():
print("The word is " ''.join(usersGuessList))
for n in secretWordList:
usersGuessList.append('_')
printGuessedLetter()
foodgamewind = Tk()
genrepicker.destroy()
widget = foodgamewind
foodgamewind.title("Hangman")
canvas = Canvas(height="500",width="500")
canvas.pack()
Label(foodgamewind,text="Your word:").pack()
Label(foodgamewind, text="Has this many letters = " str(len(secretWordList))).pack()
label = Label(foodgamewind,text=usersGuessList)
label.pack()
status = Label(foodgamewind,text="Guess a letter")
status.pack()
guess = StringVar(foodgamewind)
entry = Entry(foodgamewind, textvariable=guess)
submitbtn = Button(foodgamewind, command=whenPressed, text="Submit")
entry.pack()
submitbtn.pack()
foodgamewind.mainloop()
def genrePicker():
global genrepicker
genrepicker = Tk()
main.destroy()
genrepicker.geometry("250x100")
genrepicker.title("Genre Picker")
Label(genrepicker,text="Pick your genre...").pack()
Button(genrepicker,text="Food",command=foodgameSettings).pack()
Button(genrepicker,text="Sports",comman=sportsgameSettings).pack()
Button(genrepicker,text="Places",command=placesgameSettings).pack()
genrepicker.mainloop()
def whenPressed():
global baseattempts
global canvas
userGuess = guess.get().capitalize()
print(userGuess)
entry.delete(0,END)
usersGuesses.append(userGuess)
if guess in usersGuesses:
print("You already guess this letter")
if baseattempts > 0:
if userGuess in secretWordList:
print("Nice Guess!")
for i in range(len(secretWordList)):
if userGuess == secretWordList[i]:
letterIndex = i
usersGuessList[letterIndex] = userGuess.upper()
print("The word is " ''.join(usersGuessList))
label.config(text=usersGuessList)
if usersGuessList == secretWordList:
print("You won!")
widget.destroy()
win= Tk()
Label(text="You WON!").pack()
time.sleep(3)
win.destroy()
win.mainloop()#
mainMenu()
elif userGuess not in secretWordList:
baseattempts = baseattempts - 1
print("Try Again!")
if baseattempts == 7 :
path = "No Rope Just stand.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250,250,image=img))
if baseattempts == 6:
path = "No head just rope.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250, 250, image=img))
if baseattempts == 5:
path = "Just Head.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250, 250, image=img))
if baseattempts == 4:
path = "No Leg Stick Man.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250, 250, image=img))
if baseattempts == 3:
path = "1 Leg Stick Man.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250, 250, image=img))
if baseattempts == 2:
path = "2 Legs Stick Man.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250, 250, image=img))
if baseattempts == 1:
path = "One Arm 2 Legs Stick Man.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250, 250, image=img))
if baseattempts == 0:
path = "Full Stick Man.png"
img = ImageTk.PhotoImage(Image.open(path))
canvas.config(canvas.create_image(250, 250, image=img))
widget.destroy()
elif baseattempts == 0 and usersGuessList == secretWord:
if usersGuessList == secretWord:
print("You won!")
widget.destroy()
win = Tk()
Label(text="You WON!").pack()
time.sleep(3)
win.destroy()
win.mainloop()
if baseattempts == 0 and usersGuessList != secretWord:
print("You lost, hangman died!")
widget.destroy()
win = Tk()
Label(text="You LOST!").pack()
time.sleep(3)
win.destroy()
win.mainloop()
if usersGuessList == secretWord:
print("You won!")
win = Tk()
Label(text="You WON!").pack()
time.sleep(3)
win.mainloop()
win.destroy()
widget.destroy()
def quit():
main.destroy()
def mainMenu():
global main
main = Tk()
main.geometry("400x150")
main.title("Main Menu")
Label(main,text="Welcome to Hangman would you like to play?").pack()
Button(main,text="Play",command=genrePicker).pack()
Button(main,text="Quit", command=quit).pack()
main.mainloop()
return main
mainMenu()
Комментарии:
1. Как вы думаете
canvas.config(canvas.create_image(250,250,image=img))
, что будет делать? Вы пытаетесь настроить элемент или сам холст? Есть разница междуconfig
иitemconfig
.2. Я читал, что он редактирует элемент tkinter, который вы использовали, например, canvas = Canavs(), и он создает холст, обновляет его, но я все равно получаю это сообщение об ошибке
3. Я пытаюсь отобразить изображение, когда кнопка нажата до состояния
Ответ №1:
я верю, что вы хотите сделать, это обновить холст, поэтому вместо canvas.config(canvas.create_image(250,250,image=img))
этого вы должны сделать
canvas.create_image(250,250,image=img)
canvas.update()
здесь есть хитрость в том, что переменная img не является глобальной, поэтому изображение будет мигать, а затем будет забыто. Вы можете исправить это, используя global img
before baseattempts = baseattempts - 1