从main导入tk变量致代码报错?Python Tkinter问题求助
问题分析与解决
核心错误有两个:
1. 循环导入导致的NameError
你在main模块里导入了new_window,同时new_window又导入了main模块,这就形成了循环导入。Python处理这种情况时会出现导入顺序混乱:当main执行from new_window import *时,new_window开始执行,它第一行就导入main,此时main还没执行到定义main_menu和创建MainMenu实例的步骤,反而会再次触发main的导入,最终导致MainMenu还没被定义就被main引用,抛出NameError。
2. 没必要额外导入窗口对象
你在MainMenu的close方法里想通过导入main_menu来关闭窗口,但完全没必要——初始化MainMenu的时候,你已经把main_menu这个窗口对象作为root参数传进来了,直接用这个参数就行。
修正后的代码
main模块(无需改动,new_window修正后即可正常运行)
import tkinter as tk from new_window import * # 创建tk对象main_menu main_menu = tk.Tk() # 将tk对象传入另一个模块的类中进行配置 main_menu_obj = MainMenu(main_menu) # 启动tk主循环 main_menu.mainloop()
new_window模块(关键修正)
import tkinter as tk class MainMenu: def __init__(self, root): # 把传入的窗口对象存为实例属性,方便后续方法调用 self.root = root print('main menu') root.title('Main Menu') Label_1 = tk.Label(root, text='Main Menu') Button_1 = tk.Button(root, text='close', command=self.close) Label_1.pack() Button_1.pack() def close(self): print('closing window') # 直接使用初始化时传入的root对象关闭窗口 self.root.destroy()
内容的提问来源于stack exchange,提问作者wdsky
相关产品推荐
相关产品推荐

