使用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
相关产品推荐
相关产品推荐

