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)
Другие вопросы по тегам