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

如何在Tkinter网格中通过按钮实现选中行删除与新行添加?

Tkinter 网格添加/删除行功能实现

下面是完成后的完整代码,解决了添加新行、删除选中行的核心逻辑,同时修正了原代码中的笔误和重复创建按钮的问题:

from tkinter import *
import tkinter as tk

selected_row = None  # 记录选中的行号

def get_val(row, col):
    table[row][col] = entry_vars[row][col].get()

def select_row(row):
    global selected_row
    selected_row = row

def delete_row():    
    global selected_row
    if selected_row is None:
        return
    # 删除选中行的所有Entry组件
    for col in range(width):
        entries[selected_row][col].destroy()
    # 移除对应行的数据和组件记录
    del entry_vars[selected_row]
    del table[selected_row]
    del entries[selected_row]
    # 重新调整剩余行的网格位置,保证行号连续
    for row in range(selected_row, len(entries)):
        for col in range(width):
            entries[row][col].grid(row=row, column=col)
    selected_row = None  # 清除选中状态

def add_row():  
    row = len(entries)
    # 添加空数据行
    table.append(['' for _ in range(width)])
    row_vars = []
    row_entries = []
    for col in range(width):
        var = tk.StringVar()
        var.set(table[row][col])
        entry = tk.Entry(root, textvariable=var)
        entry.grid(row=row, column=col)
        entry.bind('<FocusOut>', lambda event, r=row, c=col: get_val(r, c))
        entry.bind('<Button-1>', lambda event, r=row: select_row(r))
        row_vars.append(var)
        row_entries.append(entry)
    entry_vars.append(row_vars)
    entries.append(row_entries)
    
root = tk.Tk()
height = 10
width = 10

table = [['' for _ in range(width)] for _ in range(height)]
entry_vars = []
entries = []  # 保存所有Entry组件,方便后续删除和位置调整

for i in range(height):
    row_vars = []
    row_entries = []
    for j in range(width):
        var = tk.StringVar()
        var.set(table[i][j])
        entry = tk.Entry(root, textvariable=var)
        entry.grid(row=i, column=j)
        entry.bind('<FocusOut>', lambda event, row=i, col=j: get_val(row, col))
        entry.bind('<Button-1>', lambda event, row=i: select_row(row))
        row_vars.append(var)
        row_entries.append(entry)
    entry_vars.append(row_vars)
    entries.append(row_entries)
        
# 按钮放在循环外,避免重复创建
b = Button(root, text="添加新行", command=add_row, width=10)
b.grid(row=20, column=0)
 
b1 = Button(root, text="删除选中行", command=delete_row, width=10)
b1.grid(row=20, column=1)

root.mainloop()

关键逻辑说明

  • 选中行机制:新增selected_row全局变量,通过绑定Entry的<Button-1>事件,点击任意单元格时将当前行号存入该变量,标记为待删除行。
  • 删除行操作:
    1. 先判断是否有选中行,无选中则直接返回
    2. 遍历选中行的所有Entry组件,调用destroy()彻底删除界面元素
    3. 从entry_vars(存储输入框变量)、table(存储数据)、entries(存储组件)三个列表中移除对应行的数据
    4. 将选中行下方的所有行向上移动一格,重新设置它们的grid位置,保证表格行号连续
  • 添加行操作:
    1. 以当前表格的总行数作为新行的行号
    2. 创建新的空数据行并加入table
    3. 为新行的每个单元格创建Entry组件,绑定数据保存和选中行事件
    4. 将新组件加入entry_vars和entries列表,并通过grid放置到表格末尾

内容的提问来源于stack exchange,提问作者Muhammad Fahim Aamir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:44:50