Tkinter窗口加载多张图片仅显示最后一张的问题求解
问题产生原因
两个问题共同导致你看到的异常现象:
- 核心原因是Tkinter图片资源未被持久引用,被Python垃圾回收机制释放:你在循环中反复给局部变量
myimg赋值,第二次循环执行时,第一次加载的first.bmp对应的PhotoImage对象已经没有任何有效变量引用,Python垃圾回收器会自动回收这部分内存,对应的Label组件拿不到有效图片数据,自然无法正常显示。最后一次循环加载的second.bmp因为myimg变量在主循环启动前一直持有引用,所以可以正常展示。 - 布局代码存在笔误:你定义了
ycord变量累加垂直坐标,但实际place()方法里写死了y=0,就算图片全部加载正常,两张图也会完全重叠在窗口左上角,无法同时看到。
修复方法
- 对所有加载的
PhotoImage对象保持持久引用,避免被垃圾回收:可以用统一列表存储所有图片对象,也可以把图片对象绑定到对应显示它的Label组件的自定义属性上。 - 修正
place()布局的坐标参数,使用累加的ycord作为y轴坐标,让多张图片垂直排列不重叠。
修复后的可运行代码:
from tkinter import * from PIL import ImageTk, Image root = Tk() nameList = ["images/icons/first.bmp", "images/icons/second.bmp"] ycord = 0 img_storage = [] # 持久存储所有图片对象,避免被GC回收 for execute in nameList: myimg = ImageTk.PhotoImage(Image.open(execute)) img_storage.append(myimg) img_label = Label(image=myimg) img_label.place(x=0, y=ycord) # 传入累加的y坐标,避免图片重叠 ycord += 80 root.mainloop()
如果你不想单独定义列表存图片,也可以在创建Label后加一行
img_label.img = myimg,把图片引用挂到Label组件的属性上,同样能避免被垃圾回收。
内容的提问来源于stack exchange,提问作者Giannis Tsakas
相关产品推荐
相关产品推荐

