将Tkinter条目添加到SQLite数据库

ix0qys7i  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(170)

我目前在尝试让我的SQLite数据库使用用户在我的tkinter输入框中输入的值更新其记录时遇到了问题。这是我的代码:

from tkinter import ttk
import sqlite3
from tkinter import *
import mysql.connector
root = Tk()

root.title("Player Statistics DBMS")
root.geometry('700x400')
root.config(bg="light blue")


conn = sqlite3.connect('player_stats.db')

cur = conn.cursor()

cur.execute("""CREATE TABLE IF NOT EXISTS player_stats ( 
        first_name text,
        points integer, 
        assists integer, 
        rebounds integer, 
        shots_made integer,
        shots_missed integer)""")

cur.close()
conn.commit()
conn.close()

first_name = StringVar()
points = IntVar()
assists = IntVar()
rebounds = IntVar()
shots_made = IntVar()
shots_missed = IntVar()
status = StringVar()



player_name = Label(top, text='Player First Name:')
player_name.place(x=290, y=20)
player_name = Entry(top, width=10)
player_name.place(x=300, y=50)

points_label = Label(top, text="Number of Points:")
points_label.place(x=37, y=100)
entry_points = Entry(top, width=10)
entry_points.place(x=45, y=130)

assist_label = Label(top, text="Number of Assists:")
assist_label.place(x=192, y=100)
assist_label = Entry(top, width=10)
assist_label.place(x=207, y=130)

rebound_label = Label(top, text="Number of Rebounds:")
rebound_label.place(x=350, y=100)
rebound_label = Entry(top, width=10)
rebound_label.place(x=369, y=130)

turnovers_label = Label(top, text="Number of Turnovers:")
turnovers_label.place(x=520, y=100)
turnovers_label = Entry(top, width=10)
turnovers_label.place(x=541, y=130)

shots_made_label = Label(top, text="Number of Shots Made:")
shots_made_label.place(x=106, y=200)
shots_made_label = Entry(top, width=10
shots_made_label.place(x=129, y=230)

shots_missed_label = Label(top, text="Number of Shots Missed:")
shots_missed_label.place(x=440, y=200)
shots_missed_label = Entry(top, width=10)
shots_missed_label.place(x=465, y=230)

enter_data_button = Button(top, text="Enter")
enter_data_button.place(x=336, y=280)

def get():
    conn = sqlite3.connect('player_stats.db')
    cur = conn.cursor()
    cur.execute("insert into player_stats values('%s', '%s', '%s', '%s', '%s', '%s')") \
    %(first_name.get(), points.get(), assists.get(), rebounds.get(), shots_made.get(), shots_missed.get())
    conn.commit()
    conn.close()
    print(conn.fetchall())
    print(status.set("Data Entered Successfully"))

enter_data_button = Button(top, text="Enter", command=get)
enter_data_button.place(x=336, y=280)

因此,每当用户在图形用户界面中输入并单击Enter按钮时,函数get()将运行,代码将收集用户输入的数据,数据库将更新。完成后,代码将输出Data Entered Succesfully。但是,当我运行它时,我得到一个错误。这是我的错误跟踪:

TypeError: unsupported operand type(s) for %: 'sqlite3.Cursor' and 'tuple'

提前感谢您的帮助。

sulc1iza

sulc1iza1#

以下行中\之前的)

cur.execute("insert into player_stats values('%s', '%s', '%s', '%s', '%s', '%s')") \
    %(first_name.get(), points.get(), assists.get(), rebounds.get(), shots_made.get(), shots_missed.get())

应移至声明末尾,如下所示:

cur.execute("insert into player_stats values('%s', '%s', '%s', '%s', '%s', '%s')" \
    %(first_name.get(), points.get(), assists.get(), rebounds.get(), shots_made.get(), shots_missed.get()))

但是,使用字符串替换可能会有SQL注入的风险,最好使用占位符

cur.execute("insert into player_stats values (?, ?, ?, ?, ?, ?)",
    (first_name.get(), points.get(), assists.get(), rebounds.get(), shots_made.get(), shots_missed.get()))

相关问题