Python Tkinter点击按钮删除列表指定项并更新序号与总和的实现方法
解决方案
核心修改点
- 新增
record_list全局变量存储每条记录的关联信息,方便删除后批量更新序号 - 重写删除逻辑,删除记录时同步移除对应数值、更新总和、重排剩余记录序号
- 移除原代码中无效的
while True循环,新增简单的数字输入校验
完整可运行代码
from tkinter import * root = Tk() root.geometry('400x400') add_room_area_var= StringVar(None) area_lst = [] index_no = 0 # 存储每条记录的关联信息:(序号标签, 数值, 记录容器组件) record_list = [] def delete_record(record_frame, area_val): global index_no # 移除对应数值 area_lst.remove(area_val) # 移除记录列表中的对应条目 for item in record_list: if item[2] == record_frame: record_list.remove(item) break # 销毁记录组件 record_frame.destroy() # 重排剩余记录的序号 for idx, item in enumerate(record_list): item[0].config(text=str(idx+1)) # 更新总和显示 sum_lbl.config(text=str(sum(area_lst))) # 同步全局序号计数 index_no = len(record_list) def add_(): add_room_area = Toplevel(root) add_room_area.title('Add Room area') add_room_area.wm_minsize(200, 50) add_room_area.resizable(False, False) add_room_area.transient(root) add_r_area_frame = LabelFrame(add_room_area, text=' Room area ', labelanchor=N) add_r_area_frame.config(padx=3, pady=3) add_r_area_frame.pack(fill=X, padx=10, pady=10) add_r_area_entry = Entry(add_r_area_frame, textvariable=add_room_area_var) add_r_area_entry.pack(fill=X) add_r_area_entry.focus_set() def ok_(): global index_no name = add_room_area_var.get() # 校验输入为纯数字,可按需扩展校验规则 if not name.isdigit(): return area_val = int(name) index_no += 1 entry_frame = Frame(root) index_lbl = Label(entry_frame, text=index_no) add_room_lbl = Label(entry_frame, text=name, width=12, bg='gray30', fg='white', pady=5) close_button = Button(entry_frame, text='X', command=lambda:delete_record(entry_frame, area_val)) entry_frame.pack(anchor=N, padx=1) index_lbl.pack(side=LEFT, padx=3) add_room_lbl.pack(fill=X, side=LEFT) close_button.pack(side=RIGHT) area_lst.append(area_val) # 新增记录存入关联列表 record_list.append((index_lbl, area_val, entry_frame)) add_room_area.destroy() area_sum = sum(area_lst) sum_lbl.config(text=area_sum) ok_button = Button(add_room_area, text='Ok', command=ok_) ok_button.pack() btn = Button(root, text='Add', command=add_) btn.pack() sum_lbl = Label(root, font=25) sum_lbl.pack(side=BOTTOM, pady=15) root.mainloop()
修改后点击任意记录的删除按钮,会自动移除该条记录对应的数值、重新计算底部总和,同时剩余记录的序号会从1开始连续重排,不会出现断号情况。
内容的提问来源于stack exchange,提问作者Milind Khobragade
相关产品推荐
相关产品推荐

