我创建了这个简单的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'
我做错了什么?
答案 0 :(得分:67)
grid
对象和所有其他小部件的pack
,place
和Entry
函数返回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)