为什么Tkinter的Entry组件get函数返回空值?

28

我正在尝试使用一个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是空的。那么一旦数据被输入,我该如何访问它呢?


在你的例子中,你到底期望得到什么?在调用 get 之前,你并没有给输入小部件任何文本,所以它当然会返回一个空字符串。 - Bryan Oakley
6个回答

49

看起来你可能对命令何时运行感到困惑。在你的例子中,在GUI显示在屏幕上之前(也就是在调用mainloop之后),你就已经调用了get方法。

试着添加一个调用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()

运行程序,输入文本到输入框中,然后点击按钮。


啊,我明白了。我对类还不是很熟悉(总体来说还是一个编程初学者),但我看到了问题所在。 我只需创建一个“分析!”按钮并将get()函数放在其中,那应该就可以解决问题了。 谢谢! - CodingCat
1
在调用超类的init方法时,你可能需要将self作为参数添加进去:tk.Tk.init(self)。否则,这个例子非常有用! - Deep-B
还有,在最后一行你拼错了app。<_<" - Deep-B

10

即使不是必须的,你也可以使用一个StringVar变量:

v = StringVar()

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

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

更多信息请参见此页面,位于effbot.org上。


1
严格来说,StringVar 并不是必需的。它们很方便,但对于这个问题而言完全是多余的。 - Bryan Oakley

2

一个没有类的简单示例:

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

1

*

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

你的错误在于没有将它放在一个定义函数内,然后你也没有使用已设置的textvariable与.get函数。

1
我发现大部分答案只展示了如何使用tkinter作为tk进行操作。这对我来说是个问题,因为我的程序有300行代码,包含大量的标签和按钮,而我需要修改很多内容。
以下是一种不需要导入tkinter as tk或使用StringVars的方法。我对原始的小程序进行了以下修改:
  • 将其制作成一个类
  • 添加了一个按钮和额外的方法。
该程序打开一个tkinter窗口,其中包含一个输入框和一个"Enter"按钮。点击"Enter"按钮会打印出输入框中的任何内容。
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()

1

您需要在其中放置一个文本变量,这样您就可以使用set()get()方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接