ValueError: literal no válido para int () con base 10: '' (Tkinter)

Sep 10 2020

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

CoolCloud Sep 10 2020 at 21:43

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

SanguineL Sep 10 2020 at 21:53

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.