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

Tkinter Listbox回调触发KeyError问题排查与解决求助

错误原因与解决方法

错误原因

  1. 索引类型不匹配:curselection()返回的是Listbox选中项的整数索引,但你把CSV内容转成了dict,尝试用整数索引去访问字典的键(字典的键是CSV第一列的路径字符串),必然触发KeyError。
  2. 数据存储方式错误:用dict(reader)转换CSV内容会丢失结构,字典只保留键值对,且如果有重复的源路径会被覆盖,同时无法通过索引直接定位条目。

解决方法

改用列表存储CSV的所有行数据,让Listbox的索引和列表索引一一对应,同时适配多选模式处理选中条目。

修正后的代码

import tkinter as tk
import csv

def flash():
    entry1.delete(0, "end")
    selected_indices = listbox1.curselection()
    # 处理多选,用分号分隔选中的完整条目
    selected_items = [items[idx] for idx in selected_indices]
    entry1.insert(0, "; ".join(selected_items))
    
root = tk.Tk()
root.geometry("700x500")

listbox1 = tk.Listbox(root, width=100, selectmode=tk.MULTIPLE)
# 用列表存储所有CSV行,保留源和目标的完整关联
items = []
with open("backups.csv", mode="r", newline='') as c:
    reader = csv.reader(c)
    for row in reader:
        # 将源文件和目标文件夹合并为易读的字符串
        item_str = f"源: {row[0]} → 目标: {row[1]}"
        items.append(item_str)
        listbox1.insert(tk.END, item_str)

listbox1.pack(anchor="w")

label1 = tk.Label(root, text="").pack()
entry1 = tk.Entry(root, width=100)
entry1.pack()

button1 = tk.Button(root, text="Select", command=flash)
button1.pack()

root.mainloop()

关键修改点

  • 用list替代dict存储CSV数据,保证每个条目都能通过索引直接访问。
  • Listbox插入条目时用tk.END自动追加,无需手动计算索引位置。
  • flash函数遍历所有选中索引,取出对应条目合并展示,适配多选模式。
  • 合并源文件与目标文件夹为一个字符串,让Listbox内容更直观清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:48:11