Ткинтер:Ошибка атрибута:Объект NoneType не имеет атрибута <имя атрибута>
-
12-09-2019 - |
Вопрос
Я создал этот простой графический интерфейс:
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()
Я запускаю пользовательский интерфейс.Когда я нажимаю на 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'
Почему entryBox
установлен в None
?
Решение
А grid
, pack
и place
функции Entry
объект и все остальные виджеты возвращаются 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
утверждения в блоках.
Другие советы
Измените эту строку:
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
!