为什么需要首先在Python中创建tkinter根?

为什么需要首先在Python中创建tkinter根?,python,tkinter,Python,Tkinter,我搜索了stackoverflow,找到了各种各样的答案,但不知道为什么。希望有人能帮助我,或者只是简单地给我指一个我能读到关于以下tkinter问题的地方(自学,尝试学习tkinter) 我试着遵循《一个简单的Hello World计划》中所述的方法。一切都很好。但我正在进行实验,以达到最低限度,更好地理解事物,并解决我认为是鸡和蛋的难题 这段代码很好地为我提供了一个窗口: import tkinter as tk root = tk.Tk() root.mainloop() 如果我将代码放

我搜索了stackoverflow,找到了各种各样的答案,但不知道为什么。希望有人能帮助我,或者只是简单地给我指一个我能读到关于以下tkinter问题的地方(自学,尝试学习tkinter)

我试着遵循《一个简单的Hello World计划》中所述的方法。一切都很好。但我正在进行实验,以达到最低限度,更好地理解事物,并解决我认为是鸡和蛋的难题

这段代码很好地为我提供了一个窗口:

import tkinter as tk
root = tk.Tk()
root.mainloop()

如果我将代码放在“root=”上方,则下面记录的代码有效,如果放在“root=”下方,则不起作用

我得到一个错误,声明“'NoneType'对象没有属性'\u root'”。我理解这是因为根尚未定义

我认为布赖恩·奥克利在会议上完美地回答了我的问题 他写道:“在创建根窗口之前,您无法创建StringVar的实例。”

我想知道的是为什么会这样?我想知道为什么,因为我认为这将使我成为一个更好的程序员。我已经看过了,但我无法找出原因

为什么需要首先在Python中创建tkinter根

Tkinter是嵌入式tcl/tk解释器的包装器。每个tkinter对象表示此嵌入式解释器中的一个对象。只有创建根窗口,解释器才会初始化。在解释器存在之前,不可能创建此解释器中存在的tkinter对象,因此必须在创建任何tkinter对象之前创建根窗口


此外,小部件存在于树状层次结构中。根据定义,树需要根。如果没有现有的根窗口,几乎不可能创建任何小部件(根窗口本身除外)。如果您创建了一个小部件而没有创建根窗口,那么将为您创建一个。但是,当您创建一个特殊的Tkinter变量(
StringVar
等)时,不会发生这种情况

“如果我将代码放在“root=”上方,下面记录的代码就可以工作,如果放在“root=”下方,则不能工作。”这应该是另一种方式吗<代码>tk实现细节放在一边,
tk.Label(root…)
如果您尚未实际定义变量
root
,则会引发一个
NameError
错误。我知道您提倡OOP,并指出了您更喜欢的方法我知道您提倡OOP,并指出了您更喜欢的方法。在那篇文章中,你的最高级别是tk.Frame。但是为什么不让第一个类成为根窗口,并让所有内容都从顶级类继承呢?@wiseass:inheritation不用于共享数据。不应该有多个根窗口,因此从这样的类继承没有任何意义。不过,我不明白这和这个答案有什么关系。
var = StringVar()
label = tk.Label(root, textvariable=var, relief=RAISED)
var.set("Hey!? How are you doing?")
label.pack()