Я использую библиотеку tkinter для создания программы hangman, но я получаю сообщение об ошибке

#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