Tkinter程序报错‘image "pyimage2" doesn't exist’,需在window1显示图片
解决Tkinter报错‘image "pyimage2" doesn't exist’及子窗口显示图片问题
问题原因
- 你创建了两个
tkinter.Tk()实例,Tkinter中每个Tk()会启动独立的Tcl解释器,图片资源无法在不同解释器间共享,导致"pyimage2"找不到的错误。 ImageTk.PhotoImage对象如果没有持久引用,会被Python垃圾回收机制回收,即使Label引用了它也可能失效。
解决步骤
- 子窗口改用
tkinter.Toplevel()创建,它依附于主Tk()实例,共享同一个资源上下文,避免冲突。 - 为
PhotoImage对象添加持久引用,绑定到窗口或Label的属性上,防止被垃圾回收。
修改后的代码
import tkinter from PIL import ImageTk, Image def imagine(): window1 = tkinter.Toplevel(window) # 基于主窗口创建子窗口 window1.geometry("1000x300") img = ImageTk.PhotoImage(Image.open("1.jpg")) label1 = tkinter.Label(window1, image=img) label1.image = img # 保留图片引用,避免被垃圾回收 label1.place(x=10,y=2) window = tkinter.Tk() window.geometry("1000x300") img = ImageTk.PhotoImage(Image.open("1.jpg")) label1 = tkinter.Label(window, image=img) label1.image = img # 保留主窗口图片引用 label1.place(x=10,y=2) b1 = tkinter.Button(window, text="E", width=50, command=imagine).place(x=100,y=2) window.mainloop() # 启动主事件循环,保证程序正常运行
关键修改说明
Toplevel(window)替代Tk():子窗口与主窗口共享同一Tcl解释器,图片资源可以正常访问。label1.image = img:通过把图片对象绑定到Label属性,维持引用计数,防止Python垃圾回收机制回收图片资源。- 添加
window.mainloop():启动主事件循环,确保窗口正常显示和响应交互。
内容的提问来源于stack exchange,提问作者TKINTER
相关产品推荐
相关产品推荐

