Python3中NameError: name 'root' is not defined错误排查求助
这个错误既不是Notebook导入的问题,也和Python版本无关,核心原因是代码缩进错误,同时你的程序还有几个其他需要修正的地方,我一步步给你拆解:
直接错误原因:缩进错误导致变量未定义
看你的错误提示:NameError: name 'root' is not defined 出现在note = Notebook(root)这一行,而且标注了in GUIDesign——这说明这行代码是写在类的顶层(和def initUI同级),而不是initUI方法的内部。
在Python中,类顶层的代码会在类定义阶段就执行,这时候root变量还没被创建(root是在main函数里生成,之后才传给类的构造方法),自然会报错说root未定义。你需要把note = Notebook(root)、tab1 = Frame(note)、tab6 = Frame(note)这三行代码缩进,放到initUI方法的内部。
程序存在的其他问题
重复导入导致命名冲突
你同时用了from tkinter import *、import tkinter as tk、from tkinter.ttk import *等多种导入方式,会导致组件命名冲突(比如Frame同时存在于原生tkinter和ttk中),也不利于代码维护。建议统一导入风格,比如用import tkinter as tk+from tkinter import ttk,通过前缀区分组件。文件名与标准库冲突
你的脚本文件名是tk.py,而代码里又写了import tkinter as tk——Python会优先加载当前目录下的tk.py作为tk模块,而不是系统标准库的tkinter,这会引发各种奇怪的导入错误。赶紧把文件名改成别的,比如tk_gui_demo.py。界面组件未添加到窗口
就算修复了缩进,你创建的Notebook和标签页也不会显示,因为你没调用note.add()给Notebook加标签页,也没调用note.pack()(或grid()/place())把Notebook放到主窗口里。
修复后的代码示例
import tkinter as tk from tkinter import ttk import tkinter.messagebox import time import os import warnings warnings.filterwarnings('ignore') class GUIDesign(): def __init__(self, root): self.initUI(root) def initUI(self, root): print("hello") label_frame_fg = "purple" label_frame_bg = "SNOW" # 创建Notebook并添加到主窗口 note = ttk.Notebook(root) note.pack(fill=tk.BOTH, expand=True) # 创建标签页并添加到Notebook tab1 = ttk.Frame(note) tab6 = ttk.Frame(note) note.add(tab1, text="标签页1") note.add(tab6, text="标签页6") def main(): root = tk.Tk() root.resizable(0, 0) root.state('zoomed') GUI = GUIDesign(root) root.mainloop() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者YSR

