Почему виджет Tkinter хранится как None? (AttributeError: объект «NoneType») (TypeError: объект «NoneType»)

#AttributeError: 'NoneType' object has no attribute ... Example

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk

root = tk.Tk()

widget = tk.Label(root, text="Label 1").grid()
widget.config(text="Label A")

root.mainloop()

Вышеприведенный код выдает ошибку:

Traceback (most recent call last):
  File "C:\Users\user\Documents\Python\other\script.py", line 8, in <module>
    widget.config(text="Label A")
AttributeError: 'NoneType' object has no attribute 'config'

Точно так же кусок кода:

#TypeError: 'NoneType' object does not support item assignment Example

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk

root = tk.Tk()

widget = tk.Button(root, text="Quit").pack()
widget['command'] = root.destroy

root.mainloop()

выдает ошибку:

Traceback (most recent call last):
  File "C:\Users\user\Documents\Python\other\script2.py", line 8, in <module>
    widget['command'] = root.destroy
TypeError: 'NoneType' object does not support item assignment

И в обоих случаях:

>>>print(widget)
None

Почему это так, почему widget сохраняется как None или почему я получаю сообщения об ошибках, описанных выше, когда пытаюсь настроить виджеты?


Этот вопрос основан на этом и задается обобщенный ответ на многие связанные и повторяющиеся вопросы по этому вопросу. См. это для отклонения редактирования.


person Nae    schedule 03.12.2017    source источник


Ответы (1)


widget хранится как None, потому что менеджер геометрии использует методы grid, pack, place возвращают None, поэтому их следует вызывать в отдельной строке от строки, создающей экземпляр виджета, например:

widget = ...
widget.grid(..)

or:

widget = ...
widget.pack(..)

or:

widget = ...
widget.place(..)

И конкретно для второго фрагмента кода в вопросе:

widget = tkinter.Button(...).pack(...)

должны быть разделены на две строки, как:

widget = tkinter.Button(...)
widget.pack(...)

Информация: Этот ответ основан, если не по большей части, скопирован из, этот ответ.

person Community    schedule 03.12.2017