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

Tkinter回调触发KeyError: 'id'问题求助(附abc.py代码)

解决Treeview双击触发GetValue函数时的KeyError: 'id'问题

常见原因及修复步骤:

  • Treeview列定义未包含'id'
    确认初始化Treeview时,columns参数里明确包含'id'列,比如:

    tree = ttk.Treeview(root, columns=('id', 'name', 'crime_type'), show='headings')
    # 给'id'列设置表头
    tree.heading('id', text='编号')
    tree.column('id', width=80)
    
  • 错误地用列名从values列表中取值
    Treeview的item()方法返回的values是有序列表,不是字典,不能直接用['id']取值。你可以通过列名找到对应索引后再取值:

    def GetValue(event):
        if not tree.selection():
            return
        selected_item = tree.selection()[0]
        row_values = tree.item(selected_item)['values']
        # 找到'id'列在columns中的索引
        id_col_index = tree['columns'].index('id')
        selected_id = row_values[id_col_index]
        # 后续业务逻辑
        print(selected_id)
    
  • MySQL查询未返回'id'字段
    检查从数据库拉取数据的SQL语句,确保包含id字段:

    SELECT id, name, crime_type FROM criminals; -- 必须包含id字段
    

    如果SQL没查询id,插入Treeview的行数据里自然没有对应值,取值时必然报错。

  • 插入Treeview时数据顺序不匹配列定义
    插入数据时,values的顺序要和columns参数的顺序完全一致,比如columns=('id', 'name', 'crime_type'),插入时就要写成:

    tree.insert('', 'end', values=(criminal_id, criminal_name, criminal_crime))
    

另一种更可靠的方式:用iid存储id

如果不想依赖列索引,可以在插入Treeview时把id作为item的iid(唯一标识),这样取值更直接:

# 插入数据时
tree.insert('', 'end', iid=str(criminal_id), values=(criminal_name, criminal_crime))

# GetValue函数中直接取iid
def GetValue(event):
    if not tree.selection():
        return
    selected_item = tree.selection()[0]
    selected_id = selected_item  # 这里的iid就是之前存的id

内容的提问来源于stack exchange,提问作者ibrahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:35:24