Python Tkinter跨文件调用Screenshot类报root未定义NameError
报错根因
- 触发错误的代码行是
Screenshot.py第18行的self.master_screen = Toplevel(root) - 这里直接引用了全局作用域下的
root变量,而这个变量仅在Screenshot.py作为主程序直接运行时,才会在if __name__ == '__main__':入口块中被定义 - 当Screenshot.py被其他文件作为模块导入时,这个入口块的代码不会执行,全局作用域不存在
root变量,因此抛出NameError - 直接运行时不报错,是因为入口块内定义的
root处于模块全局作用域,类方法可以通过作用域链找到这个变量,导入场景下这个链路是断开的
修复方案
- 将硬编码的
root替换为类实例已经存储的传入父窗口参数self.master - 修改后的代码段:
self.master_screen = Toplevel(self.master) - 修改后,不管是模块直接运行还是被外部导入调用,都可以正确获取实例化时传入的Tk根窗口对象,符合Tkinter组件的父窗口传递逻辑
补充说明
- Toplevel组件的构造逻辑本身就需要传入所属的父窗口对象作为参数,你在
__init__方法开头已经把外部传入的master赋值给了self.master,直接复用这个实例属性传递依赖即可,不需要依赖模块级别的全局变量 - 这类模块导入场景下的作用域找不到变量的问题,大多是因为代码依赖了主程序入口块内定义的全局变量,将依赖通过实例参数传递,就可以避免跨作用域的变量查找问题
内容的提问来源于stack exchange,提问作者user11812071
相关产品推荐
相关产品推荐

