ValueError: literal no válido para int () con base 10: '' (Tkinter)
Cuando intento ejecutar este código, ValueErroraparece una alusión a la función numRandom. Pensé que Python podría pasar una representación de cadena de un int a 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()
Respuestas
El problema es porque cuando se ejecuta el código, llama directamente numRamdom(), es decir, inicialmente los widgets de entrada están vacíos, y lo ejecutan con esos widgets de entrada vacíos y de ahí el error. Así que simplemente asigne un botón y un comando, como:
b = tkinter.Button(root,text='Click me',command=numRamdom)
b.grid(row=1,column=0)
Asegúrate de decir esto antes y mainloop()después del def numRamdom():. El botón simplemente ejecuta la función solo cuando se hace clic en el botón.
O si quieres un botón sin botones, prueba:
MÉTODO 1:
root.after(5000,numRamdom) #after 5 sec it will execute function
Pero tenga en cuenta que si el usuario no ingresa correctamente en 5 segundos, aparecerá algún error.
MÉTODO-2:
def numRamdom(event):
......
entryWriteNumber.bind('<Return>',numRamdom)
Esto es para que, si presiona la tecla Intro en el widget de entrada (después de ingresar datos) se ejecutará la función.
Espero que esto ayude, avíseme si hay algún error.
Salud
Aquí hay un ejemplo completamente funcional basado en su código. Su problema era intentar convertir el contenido de la Entrada antes de que hubiera algo dentro. Para solucionar este problema, puede agregar un botón que llama al comandonumRamdom()
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()
Seguirá recibiendo un error si el valor pasado no se puede convertir en un número entero, pero eso es fácil de solucionar con una ifdeclaración.