You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

错误原因

  1. Item ID 误解:tree.set()的第一个参数是TreeView自动生成的项目ID(如I001),不是行号。你用1作为ID,但初始化插入的项目ID并非数字1。
  2. 列名错误:你定义的列名是('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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:23:29