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

使用Python Tkinter实现图片按钮行:仅最后一张显示问题求助

问题原因及解决方法

问题根源

你遇到的问题是因为Python的垃圾回收机制回收了之前的ImageTk.PhotoImage对象。你重复使用了同一个变量photo,每次给它赋值新的图片时,前一个图片对象就失去了所有引用,被Python自动销毁,而Tkinter的按钮仅保存了图片的弱引用,无法阻止垃圾回收,导致前面的按钮显示空白。

解决方案

方案1:给每个按钮绑定对应的图片对象

把每个图片对象绑定到对应按钮的属性上,只要按钮存在,图片对象就不会被回收:

import tkinter as tk
from PIL import ImageTk

root = tk.Tk()
root.config(bg="black")
root.geometry("1920x90+0+0")
root.overrideredirect(True)

miFrame = tk.Frame(root, bg="black",width=1920, height=90)
miFrame.pack()

# 为每个按钮单独创建图片变量,并绑定到按钮属性
photo1 = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/accessories.png")
b1 = tk.Button(miFrame, image=photo1, border=0)
b1.image = photo1  # 关键:保留图片对象的引用
b1.place(relx=0, x=10, y=40, anchor='w')

photo2 = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/disk-apps.png")
b2 = tk.Button(miFrame, image=photo2, border=0)
b2.image = photo2
b2.place(relx=0, x=340, y=40, anchor='w')

photo3 = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/education.png")
b3 = tk.Button(miFrame, image=photo3, border=0)
b3.image = photo3
b3.place(relx=0, x=670, y=40, anchor='w')

photo4 = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/graphics.png")
b4 = tk.Button(miFrame, image=photo4, border=0)
b4.image = photo4
b4.place(relx=0, x=1000, y=40, anchor='w')

root.mainloop()

方案2:用容器保存所有图片对象

创建一个列表或字典,把所有图片对象存进去,保持强引用避免被回收:

import tkinter as tk
from PIL import ImageTk

root = tk.Tk()
root.config(bg="black")
root.geometry("1920x90+0+0")
root.overrideredirect(True)

miFrame = tk.Frame(root, bg="black",width=1920, height=90)
miFrame.pack()

photos = []  # 用列表保存所有图片对象,阻止垃圾回收

# 第一张图
photo = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/accessories.png")
photos.append(photo)
b1 = tk.Button(miFrame, image=photo, border=0)
b1.place(relx=0, x=10, y=40, anchor='w')

# 第二张图
photo = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/disk-apps.png")
photos.append(photo)
b2 = tk.Button(miFrame, image=photo, border=0)
b2.place(relx=0, x=340, y=40, anchor='w')

# 第三张图
photo = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/education.png")
photos.append(photo)
b3 = tk.Button(miFrame, image=photo, border=0)
b3.place(relx=0, x=670, y=40, anchor='w')

# 第四张图
photo = ImageTk.PhotoImage(file="/home/dave/python-programs/icons2/graphics.png")
photos.append(photo)
b4 = tk.Button(miFrame, image=photo, border=0)
b4.place(relx=0, x=1000, y=40, anchor='w')

root.mainloop()

内容的提问来源于stack exchange,提问作者dgkk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:28:15