Why is Tkinter widget stored as None? (AttributeError: 'NoneType' object …)(TypeError: 'NoneType' object …) [duplicate]

僤鯓⒐⒋嵵緔 提交于 2019-12-17 02:51:33

问题


#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()

Above code produces the error:

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'

Similarly the code piece:

#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()

produces the error:

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

And in both cases:

>>>print(widget)
None

Why is that, why is widget stored as None, or why do I get the errors above when I try configuring my widgets?


This question is based on this and is asked for a generalized answer to many related and repetitive questions on the subject. See this for edit rejection.


回答1:


widget is stored as None because geometry manager methods grid, pack, place return None, and thus they should be called on a separate line than the line that creates an instance of the widget as in:

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

or:

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

or:

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

And for the 2nd code snippet in the question specifically:

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

should be separated to two lines as:

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

Info: This answer is based on, if not for the most parts copied from, this answer.



来源:https://stackoverflow.com/questions/47619074/why-is-tkinter-widget-stored-as-none-attributeerror-nonetype-object-ty

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!