Почему 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)