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

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,无法存储字符串类型的国家名,会导致查询匹配不到结果。
具体修改方案
  1. 先修正All_Nations表结构(已投入使用的话单独修改字段类型即可,未使用直接删表重建)
CREATE TABLE "All_Nations" (
    "ID_Nations"    INTEGER,
    "Nations_name"  TEXT, -- 原类型INTEGER改为TEXT,适配字符串存储
    PRIMARY KEY("ID_Nations" AUTOINCREMENT)
);
  1. 修正查询国家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
  1. 修正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()
  1. 可选优化:可在插入前增加判断,避免国家ID为空的无效数据入库
def add():
    nation_id = get_selected_nation_id()
    if not nation_id:
        messagebox.showerror("Error", "未找到对应国家ID,请检查选择的国家是否有效")
        return
    # 后续插入逻辑不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:48:03