【问题标题】:_tkinter.TclError: Item 1 already exists with tkinter treeview_tkinter.TclError:项目 1 已经存在于 tkinter 树视图中
【发布时间】:2021-01-28 22:25:25
【问题描述】:

我创建了与树视图交互的 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

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

【问题讨论】:

  • 为什么在添加新行之前删除树视图中的所有行?您是否只想按顺序保持No. 列(没有间隙)?

标签: python python-3.x tkinter treeview


【解决方案1】:

快速修复:

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

【讨论】:

  • 它仅在树形视图中出现 1 行。我希望列表中的所有内容都显示在树视图中及其对应的列。
  • @AjJames 包含图片示例?
  • 当我使用你的实际修复时,它只是替换第一行而不是为另一个元组添加另一行。
  • @AjJames 您可能更改了错误的代码。我已经更新了答案,看看
【解决方案2】:

在向其添加新行之前,您无需清除树视图:

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)

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2020-10-20
    • 2022-07-05
    • 2017-10-22
    相关资源
    最近更新 更多