ValueError: littéral invalide pour int () avec base 10: '' (Tkinter)
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
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é
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.