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

