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
相关产品推荐
相关产品推荐

