Tkinter: AttributeError: объект NoneType не имеет атрибута <имя атрибута> - PullRequest
34 голосов
/ 09 июля 2009

Я создал этот простой графический интерфейс:

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?

Ответы [ 2 ]

68 голосов
/ 09 июля 2009

Функции 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 в блоки.

5 голосов
/ 09 июля 2009

Изменить эту строку:

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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...