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

如何使用Python Tkinter在表格每一行旁添加删除按钮

解决方案

首先明确:Tkinter 原生的 ttk.Treeview 不支持直接将按钮组件作为单元格内容插入,你当前尝试把按钮对象传入 tree.insert() 的 values 参数的思路无法实现预期效果,values 仅支持传入纯文本类的可序列化值。

可行实现方法

你可以通过计算Treeview每行的坐标,将删除按钮悬浮放置在对应行的指定列位置的方式实现需求,完整实现逻辑如下:

import tkinter as tk
from tkinter import ttk

def on_click(record_id):
    # 你的删除逻辑,比如根据id删除对应行
    selected_item = tree.selection()[0]
    tree.delete(selected_item)
    # 同时删除对应的按钮对象,避免残留
    for btn in button_list:
        if btn.record_id == record_id:
            btn.destroy()
            button_list.remove(btn)
            break

def update_button_pos():
    # 滚动/窗口大小变化时同步更新所有按钮的位置
    for btn in button_list:
        btn.destroy()
    button_list.clear()
    # 遍历所有可见行
    for item in tree.get_children():
        # 获取行对应删除列的bbox坐标:(x, y, width, height)
        bbox = tree.bbox(item, column="delete")
        if bbox:
            record_id = tree.item(item, "values")[0]
            btn = tk.Button(tree, text="delete", bg="red", fg="white", width=3, height=1,
                            command=lambda rid=record_id: on_click(rid))
            btn.record_id = record_id
            # 把按钮放在对应行的删除列位置
            btn.place(x=bbox[0], y=bbox[1], width=bbox[2], height=bbox[3])
            button_list.append(btn)

root = tk.Tk()
# 定义Treeview,预留最后一列作为删除按钮列
tree = ttk.Treeview(root, columns=("id", "content", "delete"), show="headings")
tree.heading("id", text="ID")
tree.heading("content", text="内容")
tree.heading("delete", text="操作")
# 设置删除列的宽度适配按钮大小
tree.column("delete", width=60)
tree.pack(fill=tk.BOTH, expand=True)

button_list = [] # 存储所有删除按钮对象
# 模拟你的records数据
records = [(1, "测试数据1"), (2, "测试数据2"), (3, "测试数据3")]
for record in records:
    # 这里insert的values只需要传文本内容,删除列留空即可
    tree.insert("", tk.END, values=(record[0], record[1], ""))

# 绑定触发按钮位置更新的事件
tree.bind("<Configure>", lambda e: update_button_pos())
tree.bind("<MouseWheel>", lambda e: update_button_pos()) # Windows滚动事件
tree.bind("<Button-4>", lambda e: update_button_pos()) # Linux向上滚动事件
tree.bind("<Button-5>", lambda e: update_button_pos()) # Linux向下滚动事件

# 初始加载时渲染按钮
update_button_pos()
root.mainloop()

原代码调整说明

你原有代码里的tree.insert不需要传入按钮相关参数,只需要按照你定义的表格列传入对应文本值即可,按钮的渲染和位置同步通过上述独立逻辑实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:36:04