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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:24:03