【问题标题】:Can't Adapt Type StringVar in TKinter无法在 TKinter 中调整类型 StringVar
【发布时间】:2021-09-25 22:04:32
【问题描述】:

我是 Python 新手,正在尝试使用 TKinter 和本地 PostgreSQL 数据库。我的表单加载,成功连接到数据库,但是当我尝试提交表单字段值时,我收到一条错误消息“无法适应类型 StringVar”。

我将要传递给查询的变量设置为 StringVar 或 IntVar(以匹配 postgres 表中的数据类型)。我将变量用于作为文本变量输入的值,因为它应该允许字符串和整数。我将变量类型设置为 StringVar 或 IntVar(sets 和 reps 是 IntVar)。

我很难理解为什么我的字符串没有作为字符串传递。谢谢你的帮助。我觉得我在正确的轨道上,但不确定如何正确调试此错误。

import tkinter as tk
from tkinter import ttk
from windows import set_dpi_awareness
import tkinter.font as font
import psycopg2

set_dpi_awareness()

root = tk.Tk()
root.title("Workout Log")

# Set StringVar for incoming values
exercise_value = tk.StringVar()
set_value = tk.IntVar()
rep_value = tk.IntVar()
band_value = tk.StringVar()

# Define Function for insert
def save_to_db(*args):
    try:
        connection = psycopg2.connect(user="postgres",
                                  password="XXXXXXXXXXX",
                                  host="127.0.0.1",
                                  port="5432",
                                  database="testDB")
        print("Connection Successful!")
    except:
        print("Unable to connect to database")
    try:
        cur = connection.cursor()
        cur.execute("INSERT INTO workoutlog (name, set, rep, band) VALUES (%s,%s,%s,%s)", (exercise_value, set_value, rep_value, band_value))
        connection.comit()
        cur.close()
    except (Exception, psycopg2.Error) as error:
        print("Failed to insert record", error)



# Setup main frame
main = ttk.Frame(root, padding=(30,15))
main.grid()

root.columnconfigure(0, weight=1)

# Labels and Buttons for Exercise, Set, Rep, Band, and Submit Button
exercise_label = ttk.Label(main, text="Exercise: ")
exercise_input = ttk.Entry(main, width=20, textvariable=exercise_value)
set_label = ttk.Label(main, text="Set: ")
set_input = ttk.Entry(main, width=10, textvariable=set_value)
rep_label = ttk.Label(main, text="Rep: ")
rep_input = ttk.Entry(main, width=10, textvariable=rep_value)
band_label = ttk.Label(main, text="Band: ")
band_input = ttk.Entry(main, width=10, textvariable=band_value)
submit_button = ttk.Button(main, text="Save", command=save_to_db)

# Display and align the labels and fields
exercise_label.grid(column=0, row=0, sticky="W", padx=10, pady=10)
exercise_input.grid(column=1, row=0, sticky="EW", padx=10, pady=10)
set_label.grid(column=0, row=1, sticky="W", padx=10, pady=10)
set_input.grid(column=1, row=1, sticky="EW", padx=10, pady=10)
rep_label.grid(column=0, row=2, sticky="W", padx=10, pady=10)
rep_input.grid(column=1, row=2, sticky="EW", padx=10, pady=10)
band_label.grid(column=0, row=3, sticky="W", padx=10, pady=10)
band_input.grid(column=1, row=3, sticky="EW", padx=10, pady=10)
submit_button.grid(column=0, row=4, columnspan=2, sticky="EW", pady=10)


root.mainloop()

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    您必须使用get() 方法获取值。

    params = exercise_value.get(), set_value.get(), rep_value.get(), band_value.get()
    cur.execute("INSERT INTO workoutlog (name, set, rep, band) VALUES (%s,%s,%s,%s)", params)
    

    否则,您只是传递StringVar 的实例。

    【讨论】:

    • 谢谢!!效果很好,现在我了解了这里的基本结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多