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

Tkinter数据库操作界面点击更新/删除按钮报NameError: selected_item未定义问题

问题根因

selected_item 是仅在 select_router 选中事件触发时才会被赋值的全局变量,你未选中Treeview列表中的任何行就直接点击更新/删除按钮时,该变量从未被初始化,就会触发未定义报错。另外清空输入、刷新列表后残留的旧选中值也可能引发逻辑异常。

修复步骤
  • 1 先在全局作用域初始化变量,避免未定义
    在你创建Database实例的代码后新增一行,提前声明全局变量:
db= Database('/home/db.db')
selected_item = None # 新增这行
  • 2 给更新、删除函数加选中校验,避免无选中时执行操作
    修改两个函数的逻辑,开头加非空判断:
def remove_router():
    global selected_item
    if not selected_item:
        messagebox.showwarning('操作提示', '请先选中要删除的行')
        return
    db.remove(selected_item[0])
    clear_text()
    populate_list()

def update_router():
    global selected_item
    if not selected_item:
        messagebox.showwarning('操作提示', '请先选中要更新的行')
        return
    db.update(selected_item[0], Relaz_Campionato_text.get(), Relaz_Giornata_text.get(), Data_text.get(), Ora_text.get(), Relaz_Sq1_text.get(),
                Relaz_Sq2_text.get(), Risultato_Sq1_text.get(), Risultato_Sq2_text.get())  
    populate_list()
  • 3 清空输入时同步重置选中状态,避免旧值残留
    修改clear_text函数,同步重置全局变量和Treeview选中状态:
def clear_text():
    global selected_item
    selected_item = None
    # 取消Treeview的选中状态
    router_tree_view.selection_remove(router_tree_view.selection())
    Data_entry.delete(0, END)
    Ora_entry.delete(0, END)
    Relaz_Sq1_entry.delete(0, END)
    Relaz_Sq2_entry.delete(0, END)
    Risultato_Sq1_entry.delete(0, END)    
    Risultato_Sq2_entry.delete(0, END)  
额外注意事项

你当前Database类存在表名不统一的问题:建表、查询、删除操作的是routers表,但是新增、更新操作的是ARCHIVIO_Risultati表,两者不一致会导致后续数据操作异常,建议统一为同一个表名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:57:03