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

Tkinter Treeview每行图片仅显示一张的问题修复求助

Tkinter Treeview仅显示最后一张图片的修复方案

你遇到的问题确实和Python垃圾回收机制有关:每次循环中生成的图片对象,除了最后一个,其余都因为没有被持续引用而被回收,导致Treeview只显示最后一张图片。

问题根源

你的代码里每次循环都会覆盖img变量,并且只把最后一个img赋值给DBTree.image。前面的图片对象没有任何引用指向它们,Python的垃圾回收器会把这些对象销毁,Treeview自然无法显示已经被销毁的图片。

修复方案

需要为每一张图片保留一个引用,避免被垃圾回收。可以通过在Treeview对象上维护一个列表来存储所有图片对象:

修改后的完整代码:

def displayDB(admPag):
    admPag.destroy()

    DBPag = Tk()
    DBPag.title("listr.")
    DBPag.configure(bg="#31A1FF")

    DBTree = ttk.Treeview(DBPag)
    DBTree['columns'] = ("ID", "Title", "Genres")
    DBTree.heading("#0", text="Boxart", anchor=W)
    DBTree.heading("ID", text="ID", anchor=W)
    DBTree.heading("Title", text="Title", anchor=W)
    DBTree.heading("Genres", text="Genres", anchor=CENTER)
    s = ttk.Style()
    s.configure('Treeview', rowheight=190)

    # 初始化列表用于保存所有图片引用
    DBTree.images = []

    con = sqlite3.connect("GameDB.db")
    cur = con.cursor()
    cur.execute("SELECT * FROM GameDB")

    for row in cur:
        img = Image.open(str(row[3]))
        resize_img = img.resize((130, 190), Image.LANCZOS)
        img = ImageTk.PhotoImage(resize_img)
        DBTree.insert(parent="", index="end", image=img, values=(row[0], row[1], row[2]))
        # 将图片对象添加到列表中,保留引用
        DBTree.images.append(img)

    DBTree.pack(fill=BOTH)

关键修改点

  • 新增DBTree.images = []:创建一个列表绑定在Treeview对象上,专门存储所有图片对象的引用
  • 循环内替换DBTree.image = img为DBTree.images.append(img):把每一张生成的图片都添加到列表中,确保每个图片对象都有被引用,不会被垃圾回收器销毁

这样Treeview的每一行都能正确显示对应的图片了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:55:24