Tkinter TreeView指定行列插入值报错:Item 1 not found 求助
Tkinter TreeView 指定单元格赋值报错解决方法
问题描述
尝试用tree.set()给TreeView指定行列赋值时,报错TclError: Item 1 not found,即使添加了初始化行的代码仍无法解决。原始代码如下:
import tkinter as tk from tkinter import ttk import tkinter.messagebox as msgbox root = tk.Tk() # Label ttk.Label(root, text = "App Label", font = ("Calibri bold", 20), foreground = 'darkblue').grid(column = 0, row = 0, padx = (10, 5), pady = (5, 0), sticky='', columnspan = 2) # define columns columns = ('1', '2', '3', '4', '5') tree = ttk.Treeview(root, columns=columns, show='headings', height = 120) # define headings tree.column("1", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('1', text='B 1') tree.column("2", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('2', text='B 2') tree.column("3", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('3', text='B 3') tree.column("4", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('4', text='B 4') tree.column("5", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('5', text='B 5') tree.grid(column = 0, row = 2, sticky='NSEW', padx = 20, pady = (20, 20)) tree.set(1, 'B1', '1') ## 尝试在第1行第'B1'列插入值'1' root.mainloop()
添加初始化代码后仍报错:
import pandas as pd import numpy as np # ... 其他代码 ... tree_init_df = pd.DataFrame(np.empty((12, 5), dtype = np.str)) for index, row in tree_init_df.iterrows(): tree.insert("", tk.END, text=index, values=list(row)) tree.set(1, 'B1', '1')
错误原因
- Item ID 误解:
tree.set()的第一个参数是TreeView自动生成的项目ID(如I001),不是行号。你用1作为ID,但初始化插入的项目ID并非数字1。 - 列名错误:你定义的列名是
('1','2','3','4','5'),但tree.set()中用了表头文本'B1',这不是有效的列标识符。
解决方法
方法1:保存插入时的Item ID
初始化行时,将每个tree.insert()返回的ID保存到列表中,后续通过列表索引定位行:
import tkinter as tk from tkinter import ttk import pandas as pd import numpy as np root = tk.Tk() # Label ttk.Label(root, text = "App Label", font = ("Calibri bold", 20), foreground = 'darkblue').grid(column = 0, row = 0, padx = (10, 5), pady = (5, 0), sticky='', columnspan = 2) # define columns columns = ('1', '2', '3', '4', '5') tree = ttk.Treeview(root, columns=columns, show='headings', height = 120) # define headings tree.column("1", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('1', text='B 1') tree.column("2", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('2', text='B 2') tree.column("3", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('3', text='B 3') tree.column("4", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('4', text='B 4') tree.column("5", anchor=tk.CENTER, minwidth=0, width=185, stretch=False) tree.heading('5', text='B 5') tree.grid(column = 0, row = 2, sticky='NSEW', padx = 20, pady = (20, 20)) # 初始化行并保存item ID tree_item_ids = [] tree_init_df = pd.DataFrame(np.empty((12, 5), dtype = np.str)) for index, row in tree_init_df.iterrows(): item_id = tree.insert("", tk.END, values=list(row)) tree_item_ids.append(item_id) # 设置第1行(索引0对应第一行)第'1'列的值为'1' tree.set(tree_item_ids[0], '1', '1') root.mainloop()
方法2:通过tree.get_children()获取Item ID
如果不需要提前保存ID,可以用tree.get_children()获取所有项目ID,再通过索引定位:
# 初始化行后... # 获取所有item ID,索引0对应第一行 first_row_id = tree.get_children()[0] tree.set(first_row_id, '1', '1')
关键注意点
- 列名必须使用定义时的
columns元组中的值(如'1'),不能用表头显示的文本(如'B 1')。 - TreeView的行没有行号概念,只能通过插入时返回的项目ID来定位。
内容的提问来源于stack exchange,提问作者RRSC
相关产品推荐
相关产品推荐

