为何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
相关产品推荐
相关产品推荐

