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

