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_
相关产品推荐
相关产品推荐

