Почему Tkinter Entry получает функцию, возвращающую ничего?

Я пытаюсь использовать поле Entry, чтобы получить ввод вручную, а затем работать с этими данными.

Все найденные мной источники утверждают, что я должен использовать функцию get(), но пока не нашел простой рабочий мини-пример, и я не могу заставить его работать.

Я надеюсь, что кто-то может мне сказать, что я делаю неправильно. Вот мини файл:

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

Это дает мне поле Entry, которое я могу ввести, но я не могу ничего сделать с данными после его ввода.

Я подозреваю, что мой код не работает, потому что изначально Entry пуст. Но как мне получить доступ к входным данным после их ввода?

Ответ 1

Похоже, вы можете быть смущены, когда выполняются команды. В вашем примере вы вызываете метод get, прежде чем GUI имеет возможность отображать на экране (что происходит после вызова mainloop.

Попробуйте добавить кнопку, которая вызывает метод get. Это намного проще, если вы пишете свое приложение как класс. Например:

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

Запустите программу, введите в виджет ввода и нажмите кнопку.

Ответ 2

Вы также можете использовать переменную StringVar, даже если она не является строго необходимой:

v = StringVar()

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

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

Для получения дополнительной информации см. эту страницу на effbot.org.

Ответ 3

Простой пример без классов:

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

Ответ 4

*

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

То, что вы сделали неправильно, не было помещено в функцию Define, тогда вы не использовали функцию .get с установленной вами текстовой переменной.

Ответ 5

вам нужно поместить текстовую переменную в нее, чтобы вы могли использовать метод set() и get():

var=StringVar()
x= Entry (root,textvariable=var)