如何在tkinter中通过类显示图片?(不将Canvas放入类内)
解决Tkinter Canvas封装类后图片不显示的问题
问题根源是Python垃圾回收机制:创建Button实例时未将其赋值给变量,实例创建后立即被销毁,连带self.img(PhotoImage对象)也被回收,Tkinter无法持有图片引用,导致图片无法显示。
以下是两种不将Canvas放入类内的解决方法:
方法1:保留Button实例的引用
将Button实例赋值给变量,让Python不会回收该实例,从而保留图片引用:
import tkinter as tk from PIL import ImageTk, Image window = tk.Tk() window.geometry("300x300") canvas = tk.Canvas(window, width=300, height=300,bg="red") canvas.pack() class Button(): def __init__(self, x, y, canv): self.img = ImageTk.PhotoImage(Image.open("Hover.png")) canv.create_image(x, y, image=self.img, anchor="nw") # 将实例赋值给变量,保留引用 my_btn = Button(0, 0, canvas) window.mainloop()
方法2:将图片引用绑定到Canvas对象
把图片对象的引用存储在Canvas的属性中,即使Button实例被回收,图片也能保持引用不被销毁:
import tkinter as tk from PIL import ImageTk, Image window = tk.Tk() window.geometry("300x300") canvas = tk.Canvas(window, width=300, height=300,bg="red") canvas.pack() class Button(): def __init__(self, x, y, canv): self.img = ImageTk.PhotoImage(Image.open("Hover.png")) # 给Canvas添加列表属性存储图片引用,避免被回收 if not hasattr(canv, 'image_refs'): canv.image_refs = [] canv.image_refs.append(self.img) canv.create_image(x, y, image=self.img, anchor="nw") Button(0, 0, canvas) window.mainloop()
说明
- 方法1逻辑简单,适合单个或少量Button实例的场景;
- 方法2适合批量创建Button实例,无需逐个保存变量的场景。
内容的提问来源于stack exchange,提问作者MeHocha 333
相关产品推荐
相关产品推荐

