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

Tkinter窗口创建图片不显示问题求助(附代码)

解决Tkinter中Canvas图片不显示的问题

我一眼就看出问题所在了——这是Tkinter里非常常见的垃圾回收陷阱!

你写的create_image()函数里,gif是局部变量,当函数执行完毕后,Python的垃圾回收机制会自动销毁这个变量。而Tkinter的PhotoImage对象需要保持引用才能正常显示,一旦引用被回收,图片就会从Canvas上消失(甚至根本显示不出来)。

解决方案:保持PhotoImage的引用

有几种简单的方法可以解决这个问题,选一种你觉得顺手的就行:

方法1:把图片对象绑定到Canvas组件上

我们可以把gif变量赋值给Canvas的一个属性,这样只要Canvas对象存在,图片引用就不会被回收:

from tkinter import* 

root = Tk()
pictures = ['1C kopiera.gif', '1D kopiera.gif', '1H kopiera.gif', '1S kopiera.gif', '2C kopiera. gif', '2D kopiera.gif', '2H kopiera.gif', '2S kopiera.gif', '3C kopiera.gif','3D kopiera.gif', '3H kopiera.gif', '3S kopiera.gif', '4C kopiera.gif', '4D kopiera.gif', '4H kopiera.gif', '4S kopiera.gif', '5C kopiera.gif', '5D kopiera.gif', '5H kopiera.gif', '5S kopiera.gif', '6C kopiera.gif', '6D kopiera.gif', '6H kopiera.gif', '6S kopiera.gif', '7C kopiera.gif', '7D kopiera.gif', '7H kopiera.gif', '7S kopiera.gif', '8C kopiera.gif', '8D kopiera.gif', '8H kopiera.gif', '8S kopiera.gif', '9C kopiera.gif', '9D kopiera.gif', '9H kopiera.gif', '9S kopiera.gif', '10C kopiera.gif', '10D kopiera.gif', '10H kopiera.gif', '10S kopiera.gif', '11C kopiera.gif', '11D kopiera.gif', '11S kopiera.gif', '11h kopiera.gif', '12C kopiera.gif', '12D kopiera.gif', '12H kopiera.gif', '12S kopiera.gif', '13C kopiera.gif', '13D kopiera.gif', '13H kopiera.gif', '13S kopiera.gif']

C = Canvas(root, width=1300, height=750, bg="dark green")
C.grid(column=0, row=1, columnspan=20)
root.title("Black Jack")

def create_image():
    gif = PhotoImage(file="/Users/ivanwahlund/PycharmProjects/yeboi/5C kopiera.gif")
    # 关键:把图片绑定到Canvas的属性上,避免被垃圾回收
    C.image = gif
    C.create_image(400, 350, image=gif)

create_image()
root.mainloop()

方法2:使用全局变量存储图片引用

如果你更习惯用全局变量,也可以把gif声明为全局变量,这样函数执行完后它也不会被回收:

from tkinter import* 

root = Tk()
pictures = ['1C kopiera.gif', '1D kopiera.gif', '1H kopiera.gif', '1S kopiera.gif', '2C kopiera. gif', '2D kopiera.gif', '2H kopiera.gif', '2S kopiera.gif', '3C kopiera.gif','3D kopiera.gif', '3H kopiera.gif', '3S kopiera.gif', '4C kopiera.gif', '4D kopiera.gif', '4H kopiera.gif', '4S kopiera.gif', '5C kopiera.gif', '5D kopiera.gif', '5H kopiera.gif', '5S kopiera.gif', '6C kopiera.gif', '6D kopiera.gif', '6H kopiera.gif', '6S kopiera.gif', '7C kopiera.gif', '7D kopiera.gif', '7H kopiera.gif', '7S kopiera.gif', '8C kopiera.gif', '8D kopiera.gif', '8H kopiera.gif', '8S kopiera.gif', '9C kopiera.gif', '9D kopiera.gif', '9H kopiera.gif', '9S kopiera.gif', '10C kopiera.gif', '10D kopiera.gif', '10H kopiera.gif', '10S kopiera.gif', '11C kopiera.gif', '11D kopiera.gif', '11S kopiera.gif', '11h kopiera.gif', '12C kopiera.gif', '12D kopiera.gif', '12H kopiera.gif', '12S kopiera.gif', '13C kopiera.gif', '13D kopiera.gif', '13H kopiera.gif', '13S kopiera.gif']

C = Canvas(root, width=1300, height=750, bg="dark green")
C.grid(column=0, row=1, columnspan=20)
root.title("Black Jack")

# 声明全局变量存储图片对象
gif = None

def create_image():
    global gif
    gif = PhotoImage(file="/Users/ivanwahlund/PycharmProjects/yeboi/5C kopiera.gif")
    C.create_image(400, 350, image=gif)

create_image()
root.mainloop()

额外小提示

  • 你代码里的file="" + "/Users/..."可以简化成直接写file="/Users/...",没必要加空字符串拼接。
  • 如果你之后需要加载GIF以外的图片格式(比如PNG、JPG),Tkinter原生的PhotoImage不支持,这时候需要安装Pillow库,用ImageTk.PhotoImage来处理。

内容的提问来源于stack exchange,提问作者Ivan Wahlund

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:07:16