Ткинтер:Ошибка атрибута:Объект NoneType не имеет атрибута <имя атрибута>

StackOverflow https://stackoverflow.com/questions/1101750

  •  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!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top