Tkinter: AttributeError: объект NoneType не имеет атрибута get
Я видел несколько других постов с похожим сообщением об ошибке, но не смог найти решение, которое бы исправило это в моем случае.
Я немного поболтал с 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()
Я получил интерфейс и работает. Когда я нажимаю на 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
,
Я уверен, что кто-то мог иметь дело с этим раньше. Любая помощь приветствуется.
4 ответа
grid
, pack
а также place
функции Entry
объект и всех других виджетов возвращает None
, В питоне, когда вы делаете 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)
То же самое касается label
кстати - так же, как вы уже правильно делаете для grabBtn
!
Альтернативное решение для
Python3.8+
версии, позволяющие поместить все это в одну строку с помощью :
(entryBox := Entry(root, width=60)).grid(row=2, column=1, sticky=W)
Сейчас же
entryBox
будет относиться к
Entry
виджет, а также упаковывайтесь.
Для управления символами на строку я могу предложить что-то вроде этого:
(var := Button(
text='fine', command=some_func, width=20, height=15, activebackground='grey'
)).grid(row=0, column=0, columnspan=0, rowspan=0, sticky='news')
Но в этот момент можно просто сделать это «нормально» (как предлагают другие ответы)
Источники:
За entryBox.get()
получить доступ get()
вам нужен объект Entry, ноEntry(root, width=60).grid(row=2, column=1, sticky=W)
не возвращает None.
entryBox = Entry(root, width=60)
создает новый объект входа.
Более того, вам не понадобитсяentryBox = entryBox.grid(row=2, column=1, sticky=W)
как он перепишет entryBox
ни с кем
Просто замените entryBox = entryBox.grid(row=2, column=1, sticky=W)
с участием
entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)