_tkinter.TclError: Item 1 already exists with tkinter treeview

_tkinter.TclError: Item 1 already exists with tkinter treeview

我创建了与 treeview 交互的 GUI,我想获取列表中的所有值并在 treeview 中显示它 window。我有一个添加按钮,一旦我点击它,它就会正常工作。但是第二次,它显示错误Item 1 already exists。它也没有添加到列表中。

这是我的代码:

from tkinter import *
from tkinter import ttk

root = Tk()

def add1():
    global count
    for i in tree_table.get_children():
        tree_table.delete(i)

    get_name = txt_name.get()
    get_ref = txt_ref.get()
    get_age = txt_age.get()
    get_email = txt_email.get()
    data_list.append((get_name, get_ref, get_age, get_email))

    for item in data_list:
        tree_table.insert(parent='', index='end', iid=count, text=f'{count + 1}', values=(item))
    txt_name.delete(0, END)
    txt_ref.delete(0, END)
    txt_age.delete(0, END)
    txt_email.delete(0, END)
    count += 1
    print(data_list)


tree_table = ttk.Treeview(root)
global count
count = 0

data_list = []
tree_table['columns'] = ("Name", "Reference No.", "Age", "Email Address")

tree_table.column("#0", width=30)
tree_table.column("Name", width=120, anchor=W)
tree_table.column("Reference No.", width=120, anchor=W)
tree_table.column("Age", width=120, anchor=W)
tree_table.column("Email Address", width=120, anchor=W)

headings = ["#0", "Name", "Reference No.", "Age", "Email Address"]
txt_headings = ["No.", "Name", "Reference No.", "Age", "Email Address"]
for i in range(len(headings)):
    tree_table.heading(headings[i], text=txt_headings[i], anchor=W)


txt_name = Entry(root, width=20)
txt_name.pack()
txt_ref = Entry(root, width=20)
txt_ref.pack()
txt_age = Entry(root, width=20)
txt_age.pack()
txt_email = Entry(root, width=20)
txt_email.pack()
btn_enter = Button(root, text="Add", width=20, command=add1)
btn_enter.pack()

tree_table.pack()
root.mainloop()

回溯:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\Python385\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "d:/Code/Cpet5/new.py", line 32, in add1
    tree_table.insert(parent='', index='end', iid=count, text=f'{count + 1}', values=(item))
  File "C:\Python\Python385\lib\tkinter\ttk.py", line 1366, in insert
    res = self.tk.call(self._w, "insert", parent, index,
_tkinter.TclError: Item 1 already exists

如何刷新树视图以反映列表中所做的更改?

快速修复:

删除 iid 参数:

tree_table.insert(parent='', index='end', text=f'{count + 1}', values=(item))

但这会导致编号列始终获得相同值的问题。

实际修复:

所以实际问题是你的列表包含很多值,你应该在插入后删除这些值,所以代码应该是这样的:

def add1():
    global count

    get_name = txt_name.get()
    get_ref = txt_ref.get()
    get_age = txt_age.get()
    get_email = txt_email.get()

    data_list.clear() #clear the list 
    data_list.append((get_name, get_ref, get_age, get_email)) #append to the empty list

    for item in data_list:
        tree_table.insert(parent='', index='end',iid=count, text=f'{count + 1}', values=(item))

    txt_name.delete(0, END)
    txt_ref.delete(0, END)
    txt_age.delete(0, END)
    txt_email.delete(0, END)
    count += 1

    print(data_list)

这样您每次都可以清除列表中的内容并将新值附加到列表中。 使用您的旧代码,您可以看到列表第一次是 [('1', '1', '1', '1')] 并且当附加下一组值时它变为 [('1', '1', '1', '1'), ('2', '2', '2', '2')] 因此没有足够的 space 容纳所有这些值?无论如何,这可以解决它。或者,您也可以创建这些输入的元组,然后将该元组作为 values 传递给 treeview 而无需循环,就像 acw1668 那样。

在向树视图添加新行之前不需要清除树视图:

def add1():
    global count

    get_name = txt_name.get()
    get_ref = txt_ref.get()
    get_age = txt_age.get()
    get_email = txt_email.get()

    row = (get_name, get_ref, get_age, get_email)
    data_list.append(row)
    count += 1
    tree_table.insert(parent='', index='end', iid=count, text=f'{count}', values=row)

    txt_name.delete(0, END)
    txt_ref.delete(0, END)
    txt_age.delete(0, END)
    txt_email.delete(0, END)

    print(data_list)