Warum wird Tkinter Widget als None gespeichert? (AttributeError: Objekt ‘NoneType’ …) (TypeError: Objekt ‘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() 

Der obige Code erzeugt den Fehler:

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

Ähnlich das Codestück:

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

erzeugt den Fehler:

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

Und in beiden Fällen:

 >>>print(widget) None 

Warum wird das widget als None gespeichert, oder warum bekomme ich die obigen Fehler, wenn ich versuche, meine Widgets zu konfigurieren?


Diese Frage basiert darauf und wird nach einer verallgemeinerten Antwort auf viele verwandte und sich wiederholende Fragen zu diesem Thema gefragt. Siehe dies zur Bearbeitung Ablehnung.

   

widget wird als None gespeichert, da die Methoden des geometry manager grid , pack , place None und daher in einer separaten Zeile als die Zeile aufgerufen werden müssen, in der eine Instanz des Widgets erstellt wird:

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

oder:

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

oder:

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

Und für das 2. Code-Snippet in der Frage speziell:

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

sollte zu zwei Zeilen getrennt werden als:

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

Info: Diese Antwort basiert auf, wenn nicht für die meisten kopierten Teile, diese Antwort .