如何从树视图中删除选定的行,以及同时从列表中删除元组?

How to remove selected row from the treeview, as well as the tuple from the list at the same time?

我正在尝试删除树视图中的选定项目,并将其作为元组从列表中删除。每次我再次删除和添加项目作为元组时,删除的项目仍然存在。我认为已删除的项目在我单击删除后仍在列表中。解决方案是什么?

这是我的代码:

from tkinter import *
from tkinter import ttk

class Win1:
    def __init__(self, master):
        self.master = master
        self.master.geometry('300x350')

        self.empty_list = []

        self.name = StringVar()
        self.contact = StringVar()

        self.lblname = Label(self.master, text='Name:').pack()
        self.entryname = Entry(self.master, textvariable=self.name).pack()

        self.lblcontact = Label(self.master, text="Contact number:").pack()
        self.entrycontact = Entry(self.master, textvariable=self.contact).pack()

        self.btnadd = Button(self.master, text="Add", command=self.add).pack()
        self.btndel = Button(self.master, text="Delete select", command=self.del_select).pack()

        self.t_table = ttk.Treeview(self.master)

        self.t_table['column'] = ('Name', 'Contact Number')

        self.t_table.column('#0', width=0, stretch=NO)
        self.t_table.column('Name', width=120, minwidth=30)
        self.t_table.column('Contact Number', width=100, minwidth=30)

        headings = ['#0', 'Name', 'Contact Number']
        txt_headings = ['', 'Name', 'Contact Number']

        for i in range(len(headings)):
            self.t_table.heading(headings[i], text=f'{txt_headings[i]}', anchor=W)

        for x in self.empty_list:
            self.t_table.insert(parent='', index='end', values=x)
        self.t_table.pack(fill=X)

    def add(self):
        #===== Update treeview ======
        for i in self.t_table.get_children():
            self.t_table.delete(i)
        self.empty_list.append((self.name.get(), self.contact.get()))

        for data in self.empty_list:
            self.t_table.insert(parent='', index='end', values=data)

    def del_select(self):
        selected = self.t_table.selection()
        for i in selected:
            for j in range(len(self.empty_list)):
                if self.empty_list[j] == tuple(self.t_table.item(selected)['values']):
                    self.empty_list.pop(j)
            self.t_table.delete(i)


def main():
    root = Tk()
    Win1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

这是因为您还没有删除列表中的项目。此外,如果在空列表中附加了非字符串,则可能必须将值映射到字符串

你的 del_selected 应该是这样的:

  def del_select(self):
        selected = self.t_table.selection()
        for i in selected:
            value =  tuple(map(str, self.t_table.item(i)['values']))
            self.empty_list.remove(value)
            self.t_table.delete(i)