¿Por qué la función get de Tkinter Entry no devuelve nada?
Estoy intentando utilizar un Entry
campo para obtener entradas manuales y luego trabajar con esos datos.
Todas las fuentes que he encontrado afirman que debería usar la get()
función, pero todavía no he encontrado un mini ejemplo sencillo que funcione y no puedo hacerlo funcionar.
Espero que alguien pueda decirme qué estoy haciendo mal. Aquí hay un mini archivo:
from tkinter import *
master = Tk()
Label(master, text="Input: ").grid(row=0, sticky=W)
entry = Entry(master)
entry.grid(row=0, column=1)
content = entry.get()
print(content) # does not work
mainloop()
Esto me da un Entry
campo que puedo escribir, pero no puedo hacer nada con los datos una vez escritos.
Sospecho que mi código no funciona porque inicialmente entry
está vacío. Pero entonces, ¿cómo accedo a los datos de entrada una vez que se han escrito?
Parece que puede estar confundido acerca de cuándo se ejecutan los comandos. En su ejemplo, está llamando al get
método antes de que la GUI tenga la oportunidad de mostrarse en la pantalla (lo que sucede después de llamar a mainloop
.
Intente agregar un botón que llame al get
método. Esto es mucho más fácil si escribe su solicitud como clase. Por ejemplo:
import tkinter as tk
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.entry = tk.Entry(self)
self.button = tk.Button(self, text="Get", command=self.on_button)
self.button.pack()
self.entry.pack()
def on_button(self):
print(self.entry.get())
app = SampleApp()
app.mainloop()
Ejecute el programa, escriba en el widget de entrada y luego haga clic en el botón.
También puedes usar una StringVar
variable, aunque no sea estrictamente necesario:
v = StringVar()
e = Entry(master, textvariable=v)
e.pack()
v.set("a default value")
s = v.get()
Para obtener más información, consulte esta página en effbot.org .
Un ejemplo simple sin clases:
from tkinter import *
master = Tk()
# Create this method before you create the entry
def return_entry(en):
"""Gets and prints the content of the entry"""
content = entry.get()
print(content)
Label(master, text="Input: ").grid(row=0, sticky=W)
entry = Entry(master)
entry.grid(row=0, column=1)
# Connect the entry with the return button
entry.bind('<Return>', return_entry)
mainloop()