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

如何用Python-OpenCV、PIL在窗口中展示带行前图片的DataFrame?

使用Tkinter展示带每行前置图像的DataFrame

嘿,我之前也碰到过类似的需求,用Tkinter完全能搞定!核心思路是用ttk.Treeview模拟表格结构,把DataFrame里的图像数组转换成Tkinter支持的PhotoImage对象,再插入到每行的第一个单元格里。下面是完整的可运行方案:

完整代码示例

import pandas as pd
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import numpy as np

def main():
    # 1. 创建主窗口
    root = tk.Tk()
    root.title("带图像的DataFrame展示")
    root.geometry("800x500")

    # 2. 准备示例DataFrame(替换成你自己的DataFrame)
    # 生成3张随机图像数组作为示例,你可以直接替换成自己的'img'列数据
    img1 = np.random.randint(0, 255, (60, 60, 3), dtype=np.uint8)
    img2 = np.random.randint(0, 255, (60, 60, 3), dtype=np.uint8)
    img3 = np.random.randint(0, 255, (60, 60, 3), dtype=np.uint8)
    df = pd.DataFrame({
        'img': [img1, img2, img3],
        '名称': ['图像1', '图像2', '图像3'],
        '描述': ['这是第一张示例图', '这是第二张示例图', '这是第三张示例图']
    })

    # 3. 创建Treeview组件(模拟表格)
    columns = ['图像'] + list(df.columns[1:])  # 把图像列设为第一列
    tree = ttk.Treeview(root, columns=columns, show='headings')

    # 设置列标题和宽度
    for col in columns:
        tree.heading(col, text=col)
        tree.column(col, width=150 if col == '图像' else 200)

    # 4. 遍历DataFrame,插入每行数据和图像
    # 重要:必须保存PhotoImage引用,否则会被垃圾回收导致图像消失
    image_references = []

    for idx, row in df.iterrows():
        # 把numpy图像数组转换成Tkinter可识别的格式
        img_array = row['img']
        # 如果你的图像是BGR格式(比如OpenCV读取的),要先转成RGB:img_array = cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB)
        img_pil = Image.fromarray(img_array)
        img_pil = img_pil.resize((50, 50), Image.Resampling.LANCZOS)  # 调整图像大小适配单元格
        img_tk = ImageTk.PhotoImage(img_pil)
        image_references.append(img_tk)  # 保存引用防止被回收

        # 插入行数据,第一个位置放图像
        tree.insert('', tk.END, values=(img_tk, row['名称'], row['描述']))

    # 把Treeview铺满窗口
    tree.pack(fill=tk.BOTH, expand=True)

    root.mainloop()

if __name__ == "__main__":
    main()

关键细节说明

  • 图像格式转换:Tkinter的PhotoImage不直接支持numpy数组,所以需要用PIL库把数组转成Image对象,再转换成PhotoImage。如果你的图像是用OpenCV读取的BGR格式,记得先转成RGB格式。
  • 图像引用保存:Tkinter的PhotoImage如果没有被变量持有引用,会被Python的垃圾回收机制清理,导致图像不显示,所以我们用image_references列表保存所有图像对象的引用。
  • 表格适配:你可以根据自己的需求修改列宽度和图像尺寸,让展示效果更协调。如果DataFrame有更多列,只需要在columns列表里添加对应列名,插入行时把对应值加到values参数里即可。

这个方案完全在Tkinter窗口内运行,不需要依赖HTML文件,应该能满足你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:51:58