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

如何在PySimpleGUI Table元素的单元格中使用按钮或添加图片?

PySimpleGUI 单元格内嵌按钮/图片Table实现方案

以下方案兼容 Python 3.8 + PySimpleGUI 4.47.0 版本,PySimpleGUI 原生Table控件不支持直接嵌套按钮,可选用以下两种方案实现需求:

方案一:模拟表格布局(按钮交互最完整)

不用原生Table,用Text、Image、Button控件横向排列模拟表格行,外层嵌套Column可实现滚动效果。

import PySimpleGUI as sg

# 模拟3行3列表格,第二列放图片、第三列放按钮
table_data = [
    ["行1列1", "img1.png", "操作1"],
    ["行2列1", "img2.png", "操作2"],
    ["行3列1", "img3.png", "操作3"]
]

# 表头配置
header = ["列1", "预览", "操作"]
layout = [
    [sg.Text(h, size=(15,1)) for h in header]
]

# 批量生成表格行
for row_idx, row in enumerate(table_data):
    row_layout = []
    row_layout.append(sg.Text(row[0], size=(15,1)))
    # 图片控件可通过subsample参数调整大小
    row_layout.append(sg.Image(row[1], size=(80,40), key=f"-IMG_{row_idx}-"))
    # 按钮key带行索引,方便后续识别点击位置
    row_layout.append(sg.Button(row[2], key=f"-BTN_{row_idx}-", size=(10,1)))
    layout.append(row_layout)

layout.append([sg.Button("关闭")])
window = sg.Window("模拟表格内嵌控件", layout)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, "关闭"):
        break
    # 匹配按钮点击事件
    if event.startswith("-BTN_"):
        click_row = event.split("_")[1].rstrip("-")
        sg.popup(f"你点击了第{int(click_row)+1}行的操作按钮")

window.close()
  • 优点:按钮点击、图片展示完全正常,样式可自定义,无兼容性问题
  • 缺点:数据量超过100行时性能略低于原生Table,滚动逻辑需要额外搭配Scrollable Column实现

方案二:原生Table绑定点击事件模拟按钮

保留原生Table的所有功能,通过监听单元格点击事件,给操作列单元格设置按钮样式,模拟点击效果。

import PySimpleGUI as sg

# 表格数据,第三列固定为操作按钮文案
data = [
    ["行1数据", "预览1", "点击操作"],
    ["行2数据", "预览2", "点击操作"],
    ["行3数据", "预览3", "点击操作"]
]
header = ["数据列", "预览", "操作"]

layout = [
    [sg.Table(
        values=data,
        headings=header,
        auto_size_columns=False,
        col_widths=[20, 20, 15],
        # 开启单元格点击事件
        enable_events=True,
        # 给操作列设置按钮样式
        cell_bg_color=[[sg.theme_button_color()[0], sg.theme_button_color()[0], sg.theme_button_color()[1]] for _ in range(len(data))],
        text_color=[[sg.theme_button_color()[1], sg.theme_button_color()[1], sg.theme_button_color()[0]] for _ in range(len(data))],
        key="-TABLE-"
    )],
    [sg.Button("关闭")]
]

window = sg.Window("原生Table模拟按钮", layout)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, "关闭"):
        break
    if event == "-TABLE-":
        # 获取点击的行索引
        clicked_row = values["-TABLE-"][0]
        # 计算点击的列索引
        clicked_col = window["-TABLE-"].widget.identify_column(window["-TABLE-"].widget.winfo_pointerx() - window["-TABLE-"].widget.winfo_rootx())
        clicked_col = int(clicked_col.replace("#", "")) -1
        # 匹配操作列点击
        if clicked_col == 2:
            sg.popup(f"你点击了第{clicked_row+1}行的操作按钮")

window.close()
  • 优点:支持大量数据展示,原生Table的排序、筛选、滚动功能全部可用
  • 缺点:按钮hover、点击动效需要额外适配,交互自然度略低于方案一

如果需要在原生Table的单元格内展示图片,直接将单元格内容替换为本地图片路径或base64编码的图片字符串即可,PySimpleGUI 4.47.0已内置单元格图片渲染支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:00:02