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

如何使用Tkinter Canvas显示图片?遇渲染问题求助

问题修复方案

你的代码存在两个核心问题导致图片无法正常渲染:

  1. 创建了两个独立的Canvas实例,第二个Canvas没有执行布局操作(pack/grid/place),create_image的操作完全在不可见的Canvas上执行
  2. tk.PhotoImage创建后没有被持久化引用,Python的垃圾回收机制会自动清理这个对象,最终导致图片无法显示

修复后的完整代码如下:

class MyFrame(ttk.Frame):
    def __init__(self, parent):
        ttk.Frame.__init__(self, parent, padding="10 10 10 10")
        self.pack()

        # 构建游戏UI
        ttk.Button(self, text="Pet").grid(column=0, row=0)
        ttk.Button(self, text="Feed").grid(column=1, row=0)
        ttk.Button(self, text="Wash").grid(column=2, row=0)
        ttk.Button(self, text="Exit").grid(column=3, row=0)
        ttk.Label(self, text="Happiness: [" + "|" * Happiness + "· " * (25 - Happiness) + "]").grid(
            column=4, row=1, pady=20)
        ttk.Label(self, text="Fullness:      [" + "|" * Fullness + "· " * (25 - Fullness) + "]").grid(
            column=4, row=2, pady=20)
        ttk.Label(self, text="Energy:        [" + "|" * Energy + "· " * (25 - Energy) + "]").grid(
            column=4, row=3, pady=20)
        
        # 创建单个Canvas并保留实例引用
        self.pet_canvas = tk.Canvas(self, bg='white')
        self.pet_canvas.place(relx=0, rely=.2, width=300, height=160)
        
        # 将PhotoImage存储为实例属性,避免被垃圾回收
        self.pet_image = tk.PhotoImage(file="PetAssets/Pet1Idle1.png")
        # 在已布局的可见Canvas上渲染图片,同时保留图片元素ID用于后续动画切换
        self.image_item_id = self.pet_canvas.create_image(64, 64, anchor='center', image=self.pet_image)

关键修改说明:

  • 仅创建一个Canvas实例,并用self.pet_canvas存储,方便后续动画更新时调用
  • 把PhotoImage赋值给self.pet_image,确保Python不会回收该对象
  • 在同一个完成布局的Canvas上执行create_image,保证图片渲染到可见区域

后续实现两帧动画时,可通过以下方式切换图片:

# 切换到第二帧 idle 图片
self.pet_image = tk.PhotoImage(file="PetAssets/Pet1Idle2.png")
self.pet_canvas.itemconfig(self.image_item_id, image=self.pet_image)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 21:22:26