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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:27:16