Why is Tkinter Entry's get function returning nothing?

Question:

I’m trying to use an Entry field to get manual input, and then work with that data.

All sources I’ve found claim I should use the get() function, but I haven’t found a simple working mini example yet, and I can’t get it to work.

I hope someone can tel me what I’m doing wrong. Here’s a mini file:

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()

This gives me an Entry field I can type in, but I can’t do anything with the data once it’s typed in.

I suspect my code doesn’t work because initially, entry is empty. But then how do I access input data once it has been typed in?

Asked By: CodingCat

||

Answers:

You could also use a StringVar variable, even if it’s not strictly necessary:

v = StringVar()

e = Entry(master, textvariable=v)
e.pack()

v.set("a default value")
s = v.get()

For more information, see this page on effbot.org.

Answered By: zortacon

It looks like you may be confused as to when commands are run. In your example, you are calling the get method before the GUI has a chance to be displayed on the screen (which happens after you call mainloop.

Try adding a button that calls the get method. This is much easier if you write your application as a class. For example:

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()

Run the program, type into the entry widget, then click on the button.

Answered By: Bryan Oakley

*

master = Tk()
entryb1 = StringVar

Label(master, text="Input: ").grid(row=0, sticky=W)

Entry(master, textvariable=entryb1).grid(row=1, column=1)

b1 = Button(master, text="continue", command=print_content)
b1.grid(row=2, column=1)

def print_content():
    global entryb1
    content = entryb1.get()
    print(content)

master.mainloop()

What you did wrong was not put it inside a Define function then you hadn’t used the .get function with the textvariable you had set.

Answered By: rodude123

A simple example without classes:

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()
Answered By: Marios Theofanidis

you need to put a textvariable in it, so you can use set() and get() method :

var=StringVar()
x= Entry (root,textvariable=var)
Answered By: Mehdi

Most of the answers I found only showed how to do it with tkinter as tk. This was a problem for me as my program was 300 lines long with tons of other labels and buttons, and I would have had to change a lot of it.

Here’s a way to do it without importing tkinter as tk or using StringVars. I modified the original mini program by:

  • making it a class
  • adding a button and an extra method.

This program opens up a tkinter window with an entry box and an "Enter" button. Clicking the Enter button prints whatever is in the entry box.

from tkinter import *

class mini():

    def __init__(self):
    
        master = Tk()

        Label(master, text="Input: ").grid(row=0, sticky=W)
        Button(master, text='Enter', command=self.get_content).grid(row=1)
        self.entry = Entry(master)
        self.entry.grid(row=0, column=1)
        master.mainloop()

    def get_content(self):
        content = self.entry.get()
        print(content)  


m = mini()
Answered By: Nia