如何在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>事件,点击任意单元格时将当前行号存入该变量,标记为待删除行。 - 删除行操作:
- 先判断是否有选中行,无选中则直接返回
- 遍历选中行的所有Entry组件,调用
destroy()彻底删除界面元素 - 从
entry_vars(存储输入框变量)、table(存储数据)、entries(存储组件)三个列表中移除对应行的数据 - 将选中行下方的所有行向上移动一格,重新设置它们的
grid位置,保证表格行号连续
- 添加行操作:
- 以当前表格的总行数作为新行的行号
- 创建新的空数据行并加入
table - 为新行的每个单元格创建Entry组件,绑定数据保存和选中行事件
- 将新组件加入
entry_vars和entries列表,并通过grid放置到表格末尾
内容的提问来源于stack exchange,提问作者Muhammad Fahim Aamir
相关产品推荐
相关产品推荐

