You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter窗口加载多张图片仅显示最后一张的问题求解

问题产生原因

两个问题共同导致你看到的异常现象:

  1. 核心原因是Tkinter图片资源未被持久引用,被Python垃圾回收机制释放:你在循环中反复给局部变量myimg赋值,第二次循环执行时,第一次加载的first.bmp对应的PhotoImage对象已经没有任何有效变量引用,Python垃圾回收器会自动回收这部分内存,对应的Label组件拿不到有效图片数据,自然无法正常显示。最后一次循环加载的second.bmp因为myimg变量在主循环启动前一直持有引用,所以可以正常展示。
  2. 布局代码存在笔误:你定义了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:27:31