Python操作数据库combobox关联取ID报list不可调用错误解决
问题根因
- 调用语法错误:你执行
id_campionati()后已经拿到了返回的查询结果(列表/元组类型),赋值给id_campionati_value后又加了()将其作为函数调用,直接触发list对象不可调用的报错。 - 函数返回值错误:
id_nations函数中cursor.fetchone()返回的是形如(453,)的元组,不是直接的ID数值,需要提取第一个元素才能拿到ID值。 - 命名冲突:后续代码中出现了
id_nations.set(row[10]),说明你存在一个和函数同名的Tkinter变量,会覆盖原函数,后续调用函数时实际访问的是变量,也会触发同类类型错误。 - 表结构笔误:建表语句中
Nations_name字段类型写为INTEGER,无法存储字符串类型的国家名,会导致查询匹配不到结果。
具体修改方案
- 先修正All_Nations表结构(已投入使用的话单独修改字段类型即可,未使用直接删表重建)
CREATE TABLE "All_Nations" ( "ID_Nations" INTEGER, "Nations_name" TEXT, -- 原类型INTEGER改为TEXT,适配字符串存储 PRIMARY KEY("ID_Nations" AUTOINCREMENT) );
- 修正查询国家ID的函数,改名避免命名冲突,调整返回值格式
# 函数改名,避免和同名Tkinter变量冲突 def get_selected_nation_id(): selected_nation_name = combo_Nations.get() cursor.execute('SELECT ID_Nations FROM All_Nations WHERE Nations_name=?',(selected_nation_name,)) result = cursor.fetchone() # 取元组第一个元素为ID,查询不到返回None避免报错 return result[0] if result else None
- 修正add函数中的调用逻辑
def add(): # 直接获取ID值,不需要额外加括号调用 nation_id = get_selected_nation_id() # 原有调用中id_campionati_value()去掉括号,直接传变量本身 db.insert(nations.get(), # 其他你需要传入的字段值 nation_id) messagebox.showinfo("Success", "Record Inserted") clearAll() dispalyAll()
- 可选优化:可在插入前增加判断,避免国家ID为空的无效数据入库
def add(): nation_id = get_selected_nation_id() if not nation_id: messagebox.showerror("Error", "未找到对应国家ID,请检查选择的国家是否有效") return # 后续插入逻辑不变
内容的提问来源于stack exchange,提问作者user16579669
相关产品推荐
相关产品推荐

