You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:15:56