Python中如何向Tkinter TreeView的指定列插入值
解决方案:给TreeView已有行填充Prediction列,而非新增行
我一眼就看出问题所在啦——你当前的predict()函数是在TreeView里新增空白行来插入预测值,而不是把数值填到对应学生行的Prediction in %列里,这才导致实际效果和预期不符。下面是具体的修改步骤,直接替换对应代码就行:
1. 插入初始数据时,建立学生ID与TreeView节点的映射
我们需要把每个学生的student_no和对应的TreeView行节点ID存起来,这样后续才能精准找到要更新的行。修改读取CSV插入数据的代码:
# 新增字典:用student_no做键,TreeView节点ID做值 student_node_map = {} with open('2019-2020.csv') as f: reader = csv.DictReader(f, delimiter=',') for row in reader: student_no = row['student_no'] gender = row['gender'] distance = row['distance'] scholarship = row['scholarship'] stanine = row['stanine'] # 插入行并保存返回的节点ID node_id = tree.insert("", 0, values=(student_no, gender, distance, scholarship, stanine)) # 把student_no和节点ID关联起来 student_node_map[student_no] = node_id
2. 重写predict()函数,更新已有行的Prediction列
现在我们可以根据之前的映射,把预测值精准填充到对应学生的行里。注意要保证预测值和学生行的顺序一致(因为features是从原DataFrame取的,所以pred的顺序和data的行顺序完全匹配):
def predict(): # 计算预测百分比,保留和原数据一致的顺序 pred = model.predict(features) * 100 # 遍历每一行数据和对应的预测值 for student_row, prediction in zip(data.itertuples(), pred): student_no = student_row.student_no # 通过student_no找到对应的TreeView节点 node_id = student_node_map.get(student_no) if node_id: # 更新该节点的所有列值,重点填充最后一列的预测值 tree.item(node_id, values=( student_no, student_row.gender, student_row.distance, student_row.scholarship, student_row.stanine, round(prediction, 2) # 保留两位小数,让显示更整洁 ))
3. 可选优化:调整Prediction列的宽度
你原来设置的列宽度都是100,可能不够完整显示百分比数值,建议把Prediction列的宽度调大一点:
# 注意:TreeView的列索引从#1开始对应student_no,所以prediction是第6列,对应#6 tree.column('#6', stretch=NO, minwidth=0, width=120)
为什么原来的代码会出错?
你之前的tree.insert("", 'end', values=('','','','','', x))是每次插入一行新的空白行,只填充最后一列的预测值,这就导致TreeView里出现了大量只有预测值的空行。而通过节点映射的方式,我们可以精准定位到每个学生的行,把预测值填充到对应的列中,完美实现你想要的效果。
内容的提问来源于stack exchange,提问作者Josh Nav
相关产品推荐
相关产品推荐

