Tkinter:AttributeError:NoneType对象没有属性get

时间:2009-07-09 03:48:57

标签: python user-interface tkinter

我创建了这个简单的GUI:

from tkinter import *

root = Tk()

def grabText(event):
    print(entryBox.get())    

entryBox = Entry(root, width=60).grid(row=2, column=1, sticky=W)

grabBtn = Button(root, text="Grab")
grabBtn.grid(row=8, column=1)
grabBtn.bind('<Button-1>', grabText)

root.mainloop()

我启动并运行了UI。当我单击Grab按钮时,我在控制台上收到以下错误:

C:\Python> python.exe myFiles\testBed.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "myFiles\testBed.py", line 10, in grabText
    if entryBox.get().strip()=="":
AttributeError: 'NoneType' object has no attribute 'get'

我做错了什么?

3 个答案:

答案 0 :(得分:67)

grid对象和所有其他小部件的packplaceEntry函数返回None。在a().b()的python中,表达式的结果是b()返回的任何内容,因此Entry(...).grid(...)将返回None

你应该把它分成两行,如下所示:

entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)

通过这种方式,您可以将Entry引用存储在entryBox中,并按照您的预期进行布局。如果您收集块中的所有grid和/或pack语句,这会产生额外的副作用,使您的布局更易于理解和维护。

答案 1 :(得分:5)

更改此行:

entryBox=Entry(root,width=60).grid(row=2, column=1,sticky=W)

分为以下两行:

entryBox=Entry(root,width=60)
entryBox.grid(row=2, column=1,sticky=W)

就像你已经正确地为grabBtn做的那样!

答案 2 :(得分:1)

要让entryBox.get()访问get()方法,您需要 Entry 对象,但是Entry(root, width=60).grid(row=2, column=1, sticky=W)返回None。

entryBox = Entry(root, width=60)创建一个新的Entry Object。

此外,您不需要 entryBox = entryBox.grid(row=2, column=1, sticky=W),因为它将用None重写entryBox


只需替换entryBox = entryBox.grid(row=2, column=1, sticky=W)

entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)