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

如何实现带滚动条的Tkinter图片列表?现有组合方案失效求解

可行实现思路一:基于Listbox的带图可滚动列表

Listbox本身支持插入图片,但有个容易踩的坑必须注意:一定要保留图片对象的引用,不然Python的垃圾回收机制会把图片对象销毁,导致界面上看不到图片。具体实现步骤如下:

  • 先创建Listbox和Scrollbar并绑定滚动关联,这部分你应该已经熟悉,重点在图片插入的细节处理。
  • 用PIL加载图片后转成ImageTk.PhotoImage对象,把这些对象存到一个实例属性列表里(比如self.images = []),避免被自动回收。
  • 循环插入图片到Listbox,还可以搭配文本一起展示。

给你整理好的完整代码示例:

import tkinter as tk
from PIL import ImageTk, Image

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        parent.title("带图片的可滚动Listbox")
        
        # 创建滚动条和Listbox,绑定滚动命令
        vsb = tk.Scrollbar(self, orient="vertical")
        self.listbox = tk.Listbox(self, yscrollcommand=vsb.set, width=50, height=10)
        vsb.config(command=self.listbox.yview)
        
        vsb.pack(side="right", fill="y")
        self.listbox.pack(fill="both", expand=True)
        
        # 保存图片引用,防止被垃圾回收
        self.images = []
        
        # 循环插入图片(替换成你的图片路径即可)
        for i in range(20):
            # 加载并调整图片大小适配Listbox
            img = Image.open("test_image.jpg").resize((50, 50))
            tk_img = ImageTk.PhotoImage(img)
            self.images.append(tk_img)  # 存入列表保留引用
            
            # 插入图片+文本,也可以只插图片
            self.listbox.insert(tk.END, f"图片 {i+1}", tk_img)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
可行实现思路二:基于Text组件的带图可滚动区域

你原来的代码用了Text组件,这个思路也能跑通,而且Text支持更灵活的图文混排。同样要注意图片引用的问题,调整后的实现如下:

  • 同样要把图片对象存到实例列表里,避免被回收。
  • 用text.image_create()方法插入图片,搭配text.insert()插入文本,实现更丰富的展示效果。

调整后的代码示例:

import tkinter as tk
from PIL import ImageTk, Image

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        parent.title("带图片的可滚动Text")
        
        text = tk.Text(self, wrap="none")
        vsb = tk.Scrollbar(orient="vertical", command=text.yview)
        text.configure(yscrollcommand=vsb.set)
        vsb.pack(side="right", fill="y")
        text.pack(fill="both", expand=True)
        
        # 保存图片引用
        self.images = []
        
        for i in range(20):
            # 加载并调整图片大小
            img = Image.open("test_image.jpg").resize((80, 80))
            tk_img = ImageTk.PhotoImage(img)
            self.images.append(tk_img)
            
            # 插入图片和文本,用换行分隔
            text.image_create(tk.END, image=tk_img)
            text.insert(tk.END, f" 这是第{i+1}张图片\n\n")

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
核心注意事项

不管用哪种方式,保留图片对象的引用都是关键!很多人结合图片和滚动组件时看不到图片,都是因为创建ImageTk.PhotoImage后没有把它存到持久变量里,导致Python垃圾回收把图片对象清理掉,界面自然显示不出图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:16:20