Tkinter Designer

← Guías de tkinter

¿Cómo obtengo el valor de un Entry en tkinter?

Llama a .get() sobre el widget, desde dentro de la función que se ejecuta cuando el usuario hace clic. Esa última parte es el origen de casi todas las preguntas del tipo "no devuelve nada".

import tkinter as tk

root = tk.Tk()
name_entry = tk.Entry(root)
name_entry.pack()

def greet():
    name = name_entry.get()      # léelo *ahora*, no antes
    print("Hola", name)

tk.Button(root, text="Saludar", command=greet).pack()
root.mainloop()

Por qué el tuyo vuelve vacío

El error habitual es leer el valor mientras se construye la ventana: name = name_entry.get() junto al widget en lugar de dentro del manejador. Eso se ejecuta una sola vez, antes de que el usuario haya escrito nada, así que captura una cadena vacía para siempre. Hay que llamar a .get() en el momento en que necesitas el valor.

Lo mismo ocurre al pasarlo a un command: command=greet(name_entry.get()) llama a greet de inmediato, con el valor vacío, y le entrega a tkinter lo que devuelve. Pasa la función en sí, command=greet, sin paréntesis.

La alternativa con StringVar

Un StringVar es un valor que comparten el widget y tu código. Se lee con .get() y se escribe con .set(), y el campo se actualiza solo. Es la opción más ordenada cuando varios widgets muestran el mismo valor, o cuando quieres precargar el campo.

name_var = tk.StringVar(value="Ada")
name_entry = tk.Entry(root, textvariable=name_var)

name_var.get()          # lo que el usuario ha escrito
name_var.set("Grace")   # actualiza la caja en pantalla

Limpiar y precargar el campo

Sin variable, un Entry se edita por índice. delete recibe un inicio y un final, donde "end" significa el final del texto; esta es también la respuesta a cómo se limpia un entry.

Un widget Text usa índices de línea.columna en su lugar, así que para vaciarlo se escribe text.delete("1.0", "end").

name_entry.delete(0, "end")     # vaciarlo
name_entry.insert(0, "Ada")     # y luego precargarlo

Leerlo cuando pulsan Enter

Enlazar <Return> sobre el entry te da la ruta por teclado además de la del botón. El manejador recibe un argumento event de más, que es la parte que todo el mundo olvida.

def on_enter(event):
    print(name_entry.get())

name_entry.bind("<Return>", on_enter)

Hacerlo sin buscarlo

Arrastra un Entry, marca la opción de exponer una variable y la exportación te conecta un StringVar. Los botones reciben un stub de manejador con la firma correcta, y los enlaces de eventos como <Return> son un desplegable en vez de algo que buscar, así que el valor se lee en el único sitio donde funciona.

Diseña la ventana visualmente y ve el código Python generado sobre la marcha.

Abrir el diseñador de tkinter →

Preguntas relacionadas