Python主脚本与自定义库共享变量时出现报错的问题排查
问题原因解析
代码情况
原主脚本 script.py
from tkinter import * root = Tk() frame = Frame(root) frame.pack() textDisplay = Entry(frame) textDisplay.pack() btn1=Button(root,text='add here ',command=function) btn1.pack() def function (): textDisplay.insert(0,'Some String') return root.mainloop()
自定义库 MyLib.py
from script.py import textDisplay def function (): textDisplay.insert(0,'Some String') return
修改后的 script.py
from tkinter import * from MyLib.py import * root = Tk() frame = Frame(root) frame.pack() textDisplay = Entry(frame) textDisplay.pack() btn1=Button(root,text='add here ',command=function) btn1.pack() root.mainloop()
报错内容
Traceback (most recent call last): File "c:\Users\Hp\OneDrive\Bureau\emojiDesktopKeyboard\script.py", line 5, in <module> from emojiLib import * File "c:\Users\Hp\OneDrive\Bureau\emojiDesktopKeyboard\emojiLib.py", line 1, in <module> from script import textDisplay File "c:\Users\Hp\OneDrive\Bureau\emojiDesktopKeyboard\script.py", line 32, in <module> btn1=Button(root,text='\U0001F600 ',command=enter1F600 ,width=5,font= ("Arial", 15), cursor="hand2" , bg="#a9dce3") NameError: name 'enter1F600' is not defined
核心原因
循环导入导致定义顺序混乱
修改后的script.py开头就导入MyLib,但MyLib又反向导入script.py里的textDisplay。Python脚本是从上到下执行的,此时script还没运行到创建textDisplay的代码,同时script依赖的function也还没从MyLib加载完成,直接触发变量、函数未定义的错误。导入语法错误
Python导入模块时不需要加.py后缀,你写的from MyLib.py import *和from script.py import textDisplay都是错误写法,正确格式应为from MyLib import *和from script import textDisplay。额外函数未定义
报错里提到的enter1F600未定义,说明实际代码中还有其他按钮绑定了这个函数,但该函数要么没放到自定义库中,要么导入时未成功加载,这也是直接触发报错的原因之一。
内容的提问来源于stack exchange,提问作者Bilal Belli
相关产品推荐
相关产品推荐

