首页 > 解决方案 > _tkinter.TclError:项目 1 已经存在于 tkinter 树视图中

问题描述

我创建与树视图交互的 GUI,我想获取列表中的所有值并将其显示在树视图窗口中。我有一个添加按钮,一旦单击它,它就会正常工作。但在第二次,它显示一个错误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

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

标签: pythonpython-3.xtkintertreeview

解决方案


快速解决:

摆脱iid争论:

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

但这会产生一个问题,即 No. 列总是获得相同的值。

实际修复:

所以实际的问题是你的列表包含很多值,一旦你插入它就应该去掉这些值,所以代码应该是这样的:

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')]没有足够的空间容纳所有这些值?无论如何,这可以解决它。或者您也可以对这些输入创建一个元组,然后将该元组作为valuesfor treeview 传递而不循环,就像 acw1668 所做的那样。


推荐阅读