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

Tkinter对接PostgreSQL提交表单报错Can't adapt type StringVar如何解决

错误原因

你传递给SQL执行语句的是Tkinter的StringVar/IntVar包装对象本身,而非对象内存储的实际值。这两类特殊变量是Tkinter提供的、专门用于和输入组件做双向绑定的封装类型,PostgreSQL驱动psycopg2无法识别该类型,因此抛出类型适配错误。
另外你代码里还有一处拼写错误:connection.comit() 应为 connection.commit(),否则即使插入逻辑无问题,数据也不会真正写入数据库。

修复方案

调用Tkinter变量的.get()方法即可获取其存储的原生Python类型值,修改save_to_db函数即可:

def save_to_db(*args):
    connection = None
    try:
        connection = psycopg2.connect(user="postgres",
                                  password="XXXXXXXXXXX",
                                  host="127.0.0.1",
                                  port="5432",
                                  database="testDB")
        print("Connection Successful!")
        cur = connection.cursor()
        # 调用.get()获取变量存储的实际值
        cur.execute("INSERT INTO workoutlog (name, set, rep, band) VALUES (%s,%s,%s,%s)", 
            (exercise_value.get(), set_value.get(), rep_value.get(), band_value.get()))
        # 修正拼写错误
        connection.commit()
        cur.close()
    except:
        print("Unable to connect to database")
    except (Exception, psycopg2.Error) as error:
        print("Failed to insert record", error)
    # 新增连接关闭逻辑,避免连接泄漏
    finally:
        if connection:
            connection.close()

补充注意点

如果后续执行SQL时报语法错误,需注意set是PostgreSQL的保留关键字,建议修改表字段名规避冲突,或者写SQL时用双引号包裹该字段:"set"。

调试方法

后续遇到类似类型不匹配问题时,可以在传参前打印变量的类型和值确认差异:

print(type(exercise_value), exercise_value)
print(type(exercise_value.get()), exercise_value.get())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:15:03