ValueError: littéral invalide pour int () avec base 10: '' (Tkinter)

Sep 10 2020

Lorsque j'essaye d'exécuter ce code, un ValueErrorapparaît faisant allusion à la fonction numRandom. Je pensais que Python pouvait passer une représentation sous forme de chaîne d'un int à un int.

import tkinter
import random

window = tkinter.Tk()
window.geometry('600x500')

x = random.randint(1,300)
remainingTime = True
Attempts = 4

def numRamdom():
    global Attempts
    while Attempts > 0:
        numWritten = int(entryWriteNumber.get())
        if numWritten > x:
            lblClue.configure(text = 'Its a bigger number')
            Attempts = Attempts -1
        if numWritten < x:
            lblClue.configure(text = 'Its a smaller number')
            Attempts = Attempts -1
        if numWritten == x:
            lblClue.configure(text = 'Congratulations ;)')
            remainingTime = False
            return remainingTime, countdown(0)
        if Attempts == 0:
            remainingTime = False
            return remainingTime, countdown(0), Attempts, gameOver()

entryWriteNumber = tkinter.Entry(window)
entryWriteNumber.grid(column = 0, row = 1, padx = 10, pady = 10)

numRamdom()

window.mainloop()

Réponses

CoolCloud Sep 10 2020 at 21:43

Le problème est que lorsque le code est exécuté, il appelle directement numRamdom(), c'est-à-dire qu'au départ, les widgets d'entrée sont vides et qu'ils l'exécutent avec ces widgets d'entrée vides et donc l'erreur. Alors attribuez simplement un bouton et une commande, comme:

b = tkinter.Button(root,text='Click me',command=numRamdom)
b.grid(row=1,column=0)

Assurez-vous de le dire avant mainloop()le def numRamdom():. Le bouton exécute la fonction uniquement lorsque le bouton est cliqué.

Ou si vous voulez sans bouton, essayez:

MÉTHODE-1:

root.after(5000,numRamdom) #after 5 sec it will execute function

Mais gardez à l'esprit que si l'utilisateur n'entre pas correctement dans les 5 secondes, une erreur apparaîtra.

MÉTHODE-2:

def numRamdom(event):
......

entryWriteNumber.bind('<Return>',numRamdom)

C'est pour que, si vous appuyez sur la touche Entrée dans le widget d'entrée (après avoir entré les données), il exécutera la fonction.

J'espère que cela vous aidera, faites-moi savoir si des erreurs.

À votre santé

SanguineL Sep 10 2020 at 21:53

Voici un exemple entièrement fonctionnel basé sur votre code. Votre problème essayait de convertir le contenu de l'entrée avant que quoi que ce soit ne s'y trouve. Pour résoudre ce problème, vous pouvez ajouter un bouton qui appelle la commandenumRamdom()

import tkinter
import random

window = tkinter.Tk()
window.geometry('600x500')

x = random.randint(1,300)
remainingTime = True
Attempts = 4

def numRamdom():
    global Attempts, lblClue, x
    if Attempts > 0:
            numWritten = int(entryWriteNumber.get())
            if numWritten < x:
                lblClue.configure(text = 'Its a bigger number')
                Attempts = Attempts -1
            elif numWritten > x:
                lblClue.configure(text = 'Its a smaller number')
                Attempts = Attempts -1
            else:
                lblClue.configure(text = 'Congratulations ;)')
                remainingTime = False
                #return remainingTime, countdown(0)
            if Attempts == 0:
                remainingTime = False
                #return remainingTime, countdown(0), Attempts, gameOver()
    else:
        lblClue.configure(text = "You ran out of attempts!")

entryWriteNumber = tkinter.Entry(window)
entryWriteNumber.grid(column = 0, row = 1, padx = 10, pady = 10)

entryWriteButton = tkinter.Button(window, text = "Push me!", command = numRamdom)
entryWriteButton.grid(column = 1, row = 1)

lblClue = tkinter.Label(window)
lblClue.grid(row = 2, column = 1)


window.mainloop()

Vous obtiendrez toujours une erreur si la valeur transmise ne peut pas être convertie en entier, mais c'est facile à corriger avec une ifinstruction.