在CustomTkinter中跨模块调用含图片组件时出现pyimage1不存在错误
解决_tkinter.TclError: image "pyimage1" doesn't exist错误
错误原因
- 循环导入导致上下文不匹配:主脚本
main.py导入image_script,而image_script的call_image函数又反向导入main.py的window实例,造成模块加载的循环依赖,使得CTkImage绑定的Tcl上下文与主窗口的上下文不一致,触发图片不存在的错误。 - CTkImage被垃圾回收:函数内部创建的
CTkImage如果没有持久化引用,Python的垃圾回收机制会销毁它,导致Tcl层面找不到对应的图片对象。 - 额外问题:
rely=2的位置设置会让控件完全超出窗口范围,即使修复错误也无法看到图片。
解决方案
修改代码消除循环导入,同时保留图片对象的引用:
主脚本main.py
from customtkinter import CTk import image_script window = CTk() window.geometry("1400x1000") # 将主窗口作为参数传递给函数,避免循环导入 image_script.call_image(window) window.mainloop()
模块image_script.py
from customtkinter import CTkLabel, CTkImage from PIL import Image def call_image(parent_window): # 创建图片对象 image_example = CTkImage(Image.open("images/icon_example.png"), size=(150, 100)) # 创建标签,text=""避免默认文本遮挡图片 image_label = CTkLabel(parent_window, image=image_example, text="") # 保留图片引用,防止被垃圾回收 image_label.image = image_example # 调整位置到窗口可见区域 image_label.place(relx=0.5, rely=0.5, anchor="center")
关键说明
- 消除循环导入:通过参数传递主窗口实例,避免模块间的互相导入,确保图片对象与主窗口属于同一个Tcl上下文。
- 保留图片引用:将
CTkImage赋值给标签的额外属性,阻止垃圾回收机制销毁图片资源。 - 修正控件位置:
rely=0.5让标签居中显示,确保能看到图片。
内容的提问来源于stack exchange,提问作者Sh23
相关产品推荐
相关产品推荐

