Python / Tkinter - Сообщение об ошибке при попытке сохранить изменения - PullRequest
0 голосов
/ 03 августа 2020

Я создаю базу данных для списка инструментов и матриц в Python, используя Tkinter для GUI. У меня возникают проблемы, когда я пытаюсь редактировать данные. Все работает, пока я не нажму кнопку сохранения в окне редактора. Он говорит: sqlite3.ProgrammingError: Вы не указали значение для привязки 1. Может ли кто-нибудь увидеть, что я здесь делаю неправильно?

Вот мой код:

from tkinter import *
import sqlite3

mud = Tk()
mud.title("Mud Data")
mud.geometry("400x600")

# Create database
conn = sqlite3.connect('well_sav.db')

# Create cursor
c = conn.cursor()

# Create table
# c.execute("""CREATE TABLE mud (
#     mud_type text,
#     mud_weight real ,
#     mud_viscosity real,
#     mud_pit_number real
#     )""")

# Create Submit Function for DB


def submit():
    # Connect to DB
    conn = sqlite3.connect('well_sav.db')
    # Create cursor
    c = conn.cursor()

    # Insert into table
    c.execute("INSERT INTO mud VALUES (:mud_type, :mud_weight, :mud_viscosity, :mud_pit_number)",
              {
                  'mud_type': mud_type.get(),
                  'mud_weight': mud_weight.get(),
                  'mud_viscosity': mud_viscosity.get(),
                  'mud_pit_number': mud_pit_number.get()
              })

    # Commit changes
    conn.commit()
    # Close connection
    conn.close()

    # Clear The Text Boxes
    mud_type.delete(0, END)
    mud_weight.delete(0, END)
    mud_viscosity.delete(0, END)
    mud_pit_number.delete(0, END)

# Function to edit a record


def edit():
    # Create global variables
    global editor
    global mud_type_editor
    global mud_weight_editor
    global mud_viscosity_editor
    global mud_pit_number_editor

    editor = Tk()
    editor.title("Edit mud")
    editor.geometry("400x200")

    conn = sqlite3.connect('well_sav.db')
    c = conn.cursor()

    record_id = delete_box.get()

    c.execute("SELECT * FROM mud WHERE oid = " + record_id)
    records = c.fetchall()

    mud_type_editor = Entry(editor, width=30)
    mud_type_editor.grid(row=0, column=1, pady=(10, 0))

    mud_weight_editor = Entry(editor, width=30)
    mud_weight_editor.grid(row=1, column=1)

    mud_viscosity_editor = Entry(editor, width=30)
    mud_viscosity_editor.grid(row=2, column=1)

    mud_pit_number_editor = Entry(editor, width=30)
    mud_pit_number_editor.grid(row=3, column=1)

    # Create Text box Label
    mud_type_label = Label(editor, text="Mud Type")
    mud_type_label.grid(row=0, column=0, pady=(10, 0))

    mud_weight_label = Label(editor, text="Mud Weight")
    mud_weight_label.grid(row=1, column=0)

    mud_viscosity_label = Label(editor, text="Mud Viscosity")
    mud_viscosity_label.grid(row=2, column=0)

    mud_pit_number_label = Label(editor, text="Mud Pit Number")
    mud_pit_number_label.grid(row=3, column=0)

  # Loop through results
    for record in records:
        mud_type_editor.insert(0, record[0])
        mud_weight_editor.insert(0, record[1])
        mud_viscosity_editor.insert(0, record[2])
        mud_pit_number_editor.insert(0, record[3])

    # Create save button
    edit_button = Button(editor, text="Save Update", command=update)
    edit_button.grid(row=7, column=1, pady=5, padx=5, ipadx=98)

    conn.commit()
    conn.close()

# Fucntion for updates


def update():
    conn = sqlite3.connect('well_sav.db')
    c = conn.cursor()

    record_id = delete_box.get()

    c.execute("""UPDATE mud SET 
    mud_type = :name,
    mud_weight = :length,
    mud_viscosity = :inside_diameter,
    mud_pit_number = :outside_diameter
    
    WHERE oid = :oid""",
              {
                  'mud_type': mud_type_editor.get(),
                  'mud_weight': mud_weight_editor.get(),
                  'mud_viscosity': mud_viscosity_editor.get(),
                  'mud_pit_number': mud_pit_number_editor.get(),

                  'oid': record_id
              })

    conn.commit()
    conn.close()

    editor.destroy()


# Function to delete a record


def delete():
    conn = sqlite3.connect('well_sav.db')
    c = conn.cursor()
    c.execute("DELETE FROM mud WHERE oid = " + delete_box.get())
    conn.commit()
    conn.close()


# Create Query Function


def query():
    # Connect to DB
    conn = sqlite3.connect('well_sav.db')
    # Create cursor
    c = conn.cursor()

    # Query the DB
    c.execute("SELECT *, oid FROM mud")
    records = c.fetchall()
    # print(records)

    # Loop through results
    print_records = ''
    for record in records:
        print_records += str(record[0]) + "\t " + str(record[1]) + \
            "\t " + str(record[2]) + "\t " + \
            str(record[3]) + str(record[4]) + "\n"

    query_label = Label(mud, text=print_records)
    query_label.grid(row=20, column=0, columnspan=2)

    # Commit changes
    conn.commit()
    # Close connection
    conn.close()

# Math Functions


def volume_per_foot(bha_result_text):
    bha_gallons_per_foot = float(mud_viscosity.get()) * \
        float(mud_viscosity.get()) / 1029.4
    bha_result_text.set(str(bha_gallons_per_foot))


# Create Text Boxes
mud_type = Entry(mud, width=30)
mud_type.grid(row=0, column=1, pady=(10, 0))

mud_weight = Entry(mud, width=30)
mud_weight.grid(row=1, column=1)

mud_viscosity = Entry(mud, width=30)
mud_viscosity.grid(row=2, column=1)

mud_pit_number = Entry(mud, width=30)
mud_pit_number.grid(row=3, column=1)

delete_box = Entry(mud, width=30)
delete_box.grid(row=6, column=1)

# Create Text box Label
mud_type_label = Label(mud, text="Mud Type")
mud_type_label.grid(row=0, column=0, pady=(10, 0))

mud_weight_label = Label(mud, text="Mud Weight")
mud_weight_label.grid(row=1, column=0)

mud_viscosity_label = Label(mud, text="Mud Viscosity")
mud_viscosity_label.grid(row=2, column=0)

mud_pit_number_label = Label(mud, text="Pit Number")
mud_pit_number_label.grid(row=3, column=0)

delete_box_label = Label(mud, text="Select ID")
delete_box_label.grid(row=6, column=0)

# Create Submit Button

submit_button = Button(mud, text="Save", command=submit)
submit_button.grid(row=4, column=1, pady=5, padx=5, ipadx=121)

# Create Query Button

query_button = Button(mud, text="Show Muds", command=query)
query_button.grid(row=5, column=1, pady=5, padx=5, ipadx=79)

# Create edit button
edit_button = Button(mud, text="Edit Muds", command=edit)
edit_button.grid(row=7, column=1, pady=5, padx=5, ipadx=87)

# Create delete button
delete_button = Button(mud, text="Delete Mud", command=delete)
delete_button.grid(row=8, column=1, pady=5, padx=5, ipadx=80)


# Commit changes
conn.commit()

# Close connection
conn.close()

mud.mainloop()

А вот и сообщение об ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
    return self.func(*args)
  File "mud.py", line 123, in update
    c.execute("""UPDATE mud SET
sqlite3.ProgrammingError: You did not supply a value for binding 1.

1 Ответ

0 голосов
/ 03 августа 2020

Привет, @LoudEye, и добро пожаловать в Stack Overflow! Попробуйте использовать ? вместо :, например:

c.execute("UPDATE mud SET mud_type=?,mud_weight = ?, mud_viscosity=?, mud_pit_number = ? WHERE...",(mud_type_editor.get(), mud_weight_editor.get(),mud_viscosity_editor.get(),mud_pit_number_editor.get()))

Примечание: вы также должны использовать WHERE с вопросительным знаком, как я использовал с SET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...