2009-07-09 75 views
23

我已经看到类似的错误消息,但找不到解决方案,将解决它在我的情况下的几个其他职位。Tkinter:AttributeError:NoneType对象没有属性获取

我用TkInter玩了一下,创建了一个非常简单的用户界面。代码如下 -

from string import * 
from Tkinter import * 
import tkMessageBox 

root=Tk() 
vid = IntVar() 

def grabText(event): 
    if entryBox.get().strip()=="": 
     tkMessageBox.showerror("Error", "Please enter text") 
    else: 
     print entryBox.get().strip()  

root.title("My Sample") 
root.maxsize(width=550, height=200) 
root.minsize(width=550, height=200) 
root.resizable(width=NO, height=NO)  

label=Label(root, text = "Enter text:").grid(row=2,column=0,sticky=W) 
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:\Python25>python.exe myFiles\testBed.py 
Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python25\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' 

错误追溯到Tkinter.py

我确信有人可能以前曾处理过这个问题。任何帮助表示赞赏。

+0

更多详情[** here **](https://www.begueradj.com/tkinter-saya-idiom.html) – 2017-06-27 07:50:47

回答

50

Entry对象(以及所有其他部件的)的grid(和pack,和place)函数返回None。在python中,当你做a().b()时,表达式的结果是b()返回的结果,因此Entry(...).grid(...)将返回None

你应该拆分成两行,像这样:

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

这样的话,你会得到你的Entry参考存储在entryBox,并且它奠定了像你期望的那样。如果您以块的形式收集所有的grid和/或pack陈述,这会带来额外的副作用,使您的布局更易于理解和维护。

3

改变这一行:

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) 

同样为label的方式 - 就像你已经正确地为grabBtn做!

+0

感谢Alex。我应该想到:-) – Arnkrishn 2009-07-09 19:43:15