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

为何Tkinter自定义类代码无法显示图片?普通代码却正常?

Tkinter类继承场景下图片无法显示的原因及修复方案

这问题我之前踩过同款坑!咱们先对比你给出的两段代码:

图片无法显示的类实现代码:

from tkinter import *
class app(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        image = PhotoImage(file="image.gif")
        Label(image=image).pack()
window = app()
window.mainloop()

图片正常显示的普通实现代码:

from tkinter import *
root = Tk()
image = PhotoImage(file="image.gif")
Label(image=image).pack()
root.mainloop()

核心原因:Python垃圾回收机制在搞事

在你的类实现里,image是__init__方法内的局部变量——当__init__方法执行完毕后,这个变量就没有任何有效引用了,Python的垃圾回收器会直接把它销毁。而Tkinter的Label组件只是持有了图片对象的弱引用,没法阻止垃圾回收,所以图片就凭空消失了。

反观第二段代码,image是全局变量,整个程序运行期间都有持续的引用,不会被回收,所以图片能正常渲染。

修复方案:把图片绑定为实例属性

只需要把局部的image改成窗口实例的属性,让它和窗口对象绑定在一起,只要窗口还在运行,图片就不会被回收。修改后的代码如下:

from tkinter import *
class app(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        # 将image绑定为实例属性,避免被垃圾回收
        self.image = PhotoImage(file="image.gif")
        Label(image=self.image).pack()
window = app()
window.mainloop()

这样调整后,图片就能正常显示啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:23:11