Tkinter Treeview行显示pyimage1而非图片的解决求助
解决ttk Treeview显示图片出现
pyimage1的问题 核心原因
出现pyimage1这类占位符,本质是Tkinter的PhotoImage(或ImageTk.PhotoImage)对象被Python垃圾回收机制销毁——Tkinter图片对象需要绑定一个持久存在的引用,否则会被回收,Treeview只能显示残留的对象标识。
具体解决方案
1. 保留图片对象的持久引用
不要在函数内部临时创建图片对象后直接传入Treeview,而是将图片对象存储在全局变量、类实例变量,或者Treeview自身的属性中,确保其生命周期与Treeview一致。
示例代码:
import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk def show_table(): root = tk.Tk() root.title("Treeview Image Demo") # 创建Treeview tree = ttk.Treeview(root, columns=("name", "icon"), show="headings") tree.heading("name", text="名称") tree.heading("icon", text="图标") tree.pack() # 用Treeview属性存储图片,避免被垃圾回收 tree.preserved_images = [] # 加载并插入图片 img_path = "your_image.png" # 替换为实际图片路径 img = Image.open(img_path).resize((25, 25)) # 调整尺寸适配单元格 tk_img = ImageTk.PhotoImage(img) tree.preserved_images.append(tk_img) # 插入行,传入图片对象 tree.insert("", "end", values=("测试条目", tk_img)) root.mainloop() show_table()
2. 确保图片与主窗口关联
如果使用Tkinter原生PhotoImage,必须指定master参数为Treeview的父窗口,避免跨Tk实例冲突:
tk_img = tk.PhotoImage(file="test.gif", master=root)
3. 处理图片格式兼容性
- Tkinter原生
PhotoImage仅支持GIF、PGM、PPM格式,PNG、JPG等格式必须用PIL/Pillow的ImageTk.PhotoImage加载; - 确保已安装Pillow:
pip install pillow
4. 避免多Tk实例冲突
程序中只能存在一个tk.Tk()主窗口实例,其他弹窗需用tk.Toplevel(),否则图片对象会因绑定到不同Tk实例而失效。
排查步骤
- 验证图片路径正确,能正常打开;
- 检查图片对象是否被保留(如打印
tree.preserved_images确认存在); - 用最简测试代码(如上述示例)验证显示逻辑,排除复杂业务代码干扰。
内容的提问来源于stack exchange,提问作者6_Anurag Pathak
相关产品推荐
相关产品推荐

