Tkinter中canvas.create_image生成图片不显示,疑垃圾回收销毁PhotoImage如何解决
问题原因
Tkinter的PhotoImage对象存在引用保留机制缺陷,你代码里直接把PhotoImage(file='running_1.png')作为临时参数传入canvas.create_image(),方法执行完成后这个临时的图片对象没有被任何变量持有,会被Python垃圾回收机制提前销毁,最终画布上没有可渲染的图片资源,所以看不到内容。而create_rectangle生成的是画布内置矢量图形,不依赖外部对象引用,所以可以正常显示。
解决方法
只需要单独给PhotoImage实例赋值给一个变量,人为保留住它的引用即可,修改后的代码如下:
from tkinter import * root = Tk() canvas = Canvas(root, bg="yellow") # 单独声明变量持有图片对象,避免被垃圾回收 dino_img = PhotoImage(file='running_1.png') dino = canvas.create_image(600, 200, image=dino_img) canvas.pack(fill="both", expand=True) root.mainloop()
如果是在类中使用该方法,把图片对象赋值给实例属性即可,比如self.dino_img = PhotoImage(file='running_1.png'),就能保证实例生命周期内图片对象不会被回收。
内容的提问来源于stack exchange,提问作者Sticonike
相关产品推荐
相关产品推荐

