如何在Python中使用tkinter和mysql进行更新查询?

问题描述 投票:0回答:2

我正在尝试制作一个具有以下功能的图书馆管理应用程序:添加书籍,删除书籍,查看书籍,搜索书籍,编辑书籍所有这些功能都是在创建的表(library1)上完成的MYSQL 中的数据库(称为 Library)。但是我无法使用 Tkinter 更新 MySQL 中的表。它只是不会更新,我尝试检查表名不同的地方,但事实并非如此。它不会产生任何错误,但 mysql 中的表没有得到更新,但是整个 python 程序按预期工作,除了更新窗口应将书籍的更新值发送到 MYSQL 以便在填写值后进行更改的部分之外如图所示的形式 Update window after searching for a book by ISBN

完整代码:

import tkinter
import tkinter as tk
from tkinter import *
import mysql.connector
from tkinter import messagebox
import tkcalendar
from PIL import Image, ImageTk

mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    password="Y1234",
    database="library"
)
mycursor = mydb.cursor()


def opendeleteWindow():
    deletewindow = tk.Toplevel(root)
    deletewindow.geometry("600x400")
    deletewindow.title("delete window")
    maindframe = tk.Frame(deletewindow, width=600, height=400, bg="light yellow")
    maindframe.pack_propagate(False)
    maindframe.pack()
    # dlabel = tk.Label(deletewindow, text="this is the delete window")
    # dlabel.pack()
    clabel = tk.Label(maindframe, text="enter book code")
    clabel.pack(side=tk.TOP)
    centry = tk.Entry(maindframe, textvariable=book_c, width=100)
    centry.pack(side=tk.TOP)
    deletebutton = tk.Button(maindframe, text="delete", font=("Arial", 8), command=lambda: [delete_book(),
                                                                                            deletewindow.destroy()])
    deletebutton.place(x=450, y=50)


def opensearchWindow():
    searchwindow = tk.Toplevel(root)
    searchwindow.geometry("600x400")
    searchwindow.title("search window")
    mainsframe = tk.Frame(searchwindow, width=600, height=400, bg="light yellow")
    mainsframe.grid_propagate(False)
    mainsframe.grid(row=0, column=0)
    # slabel = tk.Label(searchwindow, text="this is the search window")
    # slabel.pack()
    book_isbn2 = myentry.get()
    mycursor.execute("SELECT * FROM library1 where ISBN='" + book_isbn2 + "'")
    headstr = [mycursor.column_names]
    hrows = len(headstr)
    hcolumns = len(headstr[0])
    lst = mycursor.fetchall()
    rows = len(lst)
    columns = len(lst[0])
    for i in range(hrows):
        for j in range(hcolumns):
            sh = tk.Entry(mainsframe, width=20, fg="black", font=("Arial", 7, "bold"))
            sh.grid(row=i, column=j)
            sh.insert(tk.END, headstr[i][j])
    for i in range(rows):
        for j in range(columns):
            sh = tk.Entry(mainsframe, width=20, fg="blue", font=("Arial", 7))
            sh.grid(row=i + 1, column=j)
            sh.insert(tk.END, lst[i][j])


def openviewWindow():
    viewwindow = tk.Toplevel(root)
    viewwindow.geometry("600x400")
    viewwindow.title("view window")
    mainvframe = tk.Frame(viewwindow, width=600, height=400, bg="light yellow")
    mainvframe.grid_propagate(False)
    mainvframe.grid(row=0, column=0)
    # vlabel = tk.Label(viewwindow, text="this is the view window")
    # vlabel.grid()
    mycursor.execute("SELECT * FROM library1")
    headstr = [mycursor.column_names]
    hrows = len(headstr)
    hcolumns = len(headstr[0])
    lst = mycursor.fetchall()
    rows = len(lst)
    columns = len(lst[0])
    for i in range(hrows):
        for j in range(hcolumns):
            sh = tk.Entry(mainvframe, width=20, fg="black", font=("Arial", 7, "bold"))
            sh.grid(row=i, column=j)
            sh.insert(tk.END, headstr[i][j])
    for i in range(rows):
        for j in range(columns):
            sh = tk.Entry(mainvframe, width=20, fg="blue", font=("Arial", 7))
            sh.grid(row=i + 1, column=j)
            sh.insert(tk.END, lst[i][j])
    button_close = tk.Button(mainvframe, text="Close", font=("Arial", 12), command=viewwindow.destroy)
    button_close.place(x=500, y=350)


def openaddWindow():
    addwindow = tk.Toplevel(root)
    addwindow.geometry("600x400")
    addwindow.title("add window")
    # alabel = tk.Label(addwindow, text="this is the add window")
    # alabel.pack()
    mainaframe = tk.Frame(addwindow, width=600, height=400, bg="light yellow")
    mainaframe.pack_propagate(False)
    mainaframe.pack()
    nolabel = tk.Label(mainaframe, text="Book ISBN")
    nolabel.place(x=2, y=5)
    noentry = tk.Entry(mainaframe, textvariable=book_isbn, width=100)
    noentry.place(x=2, y=30)
    nalabel = tk.Label(mainaframe, text="Book Name")
    nalabel.place(x=2, y=60)
    naentry = tk.Entry(mainaframe, textvariable=book_na, width=100)
    naentry.place(x=2, y=90)
    ylabel = tk.Label(mainaframe, text="Book Date of Issue")
    ylabel.place(x=2, y=120)

    yentry = tk.Entry(mainaframe, textvariable=book_y, width=80)
    yentry.place(x=2, y=150)

    yentry = tkcalendar.DateEntry(mainaframe, selectmode="day", date_pattern="YYYY-MM-dd", textvariable=book_y,
                                  width=80)
    yentry.place(x=2, y=150)

    wlabel = tk.Label(mainaframe, text="Author")
    wlabel.place(x=2, y=180)
    wentry = tk.Entry(mainaframe, textvariable=writer, width=100)
    wentry.place(x=2, y=210)
    clabel = tk.Label(mainaframe, text="Book Code")
    clabel.place(x=2, y=240)
    centry = tk.Entry(mainaframe, textvariable=book_c, width=100)
    centry.place(x=2, y=270)
    avlabel = tk.Label(mainaframe, text="Book Availability")
    avlabel.place(x=2, y=300)
    #frame for first radiobutton
    frame = tk.Frame(mainaframe)
    frame.place(x=2, y=330)
    # frame for second radiobutton
    book_av.set("none")

    aava = Radiobutton(frame, text="Available", variable=book_av, value="Available", bg="tan")
    aava.pack(anchor=W)
    notava = Radiobutton(frame, text="Not Available", variable=book_av, value="Not Available", bg="tan")
    notava.pack(side=LEFT)

    buttoninsert = tk.Button(mainaframe, text="Insert Book", font=("Arial", 12), command=lambda: [insert_book(),
                                                                                                  addwindow.destroy()])
    buttoninsert.place(x=500, y=350)



def open_update_window():

    update_window = tk.Toplevel(root)
    update_window.geometry("600x400")
    update_window.title("Update window")
    mainuframe = tk.Frame(update_window, width=600, height=400, bg="light yellow")
    mainuframe.grid_propagate(False)
    mainuframe.grid(row=0, column=0)
    u_nolabel = tk.Label(mainuframe, text="Book ISBN")
    u_nolabel.place(x=2, y=5)
    u_noentry = tk.Entry(mainuframe, textvariable=book_isbn, width=100)
    u_noentry.place(x=2, y=30)
    u_nalabel = tk.Label(mainuframe, text="Book Name")
    u_nalabel.place(x=2, y=60)
    u_naentry = tk.Entry(mainuframe, textvariable=u_book_na, width=100)
    u_naentry.place(x=2, y=90)
    u_ylabel = tk.Label(mainuframe, text="Book Date of Issue")
    u_ylabel.place(x=2, y=120)
    u_yentry = tkcalendar.DateEntry(mainuframe, selectmode="day", date_pattern="YYYY-MM-dd", textvariable=u_book_y,width=80)
    u_yentry.place(x=2, y=150)
    u_wlabel = tk.Label(mainuframe, text="Author")
    u_wlabel.place(x=2, y=180)
    u_wentry = tk.Entry(mainuframe, textvariable=u_writer, width=100)
    u_wentry.place(x=2, y=210)
    u_clabel = tk.Label(mainuframe, text="Book Code")
    u_clabel.place(x=2, y=240)
    u_centry = tk.Entry(mainuframe, textvariable=u_book_c, width=100)
    u_centry.place(x=2, y=270)
    u_avlabel = tk.Label(mainuframe, text="Book Availability")
    u_avlabel.place(x=2, y=300)
    # frame fro first radiobutton
    frame = tk.Frame(mainuframe)
    frame.place(x=2, y=330)
    # frame for second radiobutton
    u_avvv = u_book_av
    aava = Radiobutton(frame, text="Available", variable=u_avvv, value="Available", bg="tan")
    aava.pack(anchor=W)
    notava = Radiobutton(frame, text="Not Available", variable=u_avvv, value="Not Available", bg="tan")
    notava.pack(side=LEFT)

    update_button = tk.Button(mainuframe, text="Update Book", command=lambda: [update_book(), update_window.destroy()])
    update_button.place(x=500, y=350)

def isbnn_search_window():
    isbn_search = tk.Toplevel(root)
    isbn_search.geometry("400x400")
    isbn_search.title("ISBN Search")
    mainsframe =tk.Frame(isbn_search, width=400, height=400, bg="light yellow")
    mainsframe.pack_propagate(False)
    mainsframe.pack()
    isbnlabel = tk.Label(mainsframe, text="Book ISBN to update")
    isbnlabel.pack(side=tk.TOP)
    global isbnentry
    isbnentry= tk.Entry(mainsframe, textvariable=book_isbn, width=80)
    isbnentry.pack(side=tk.TOP)
    isbnsearchbutton = tk.Button(mainsframe, text="Search for Book to Update", font=("Arial", 8), command=lambda: [search_isbn(),isbn_search.destroy()])
    isbnsearchbutton.place(x=300, y=50)

def insert_book():
    # nonlocal noentry,naentry, wentry, centry, aventry
    b_isbn = book_isbn.get()
    b_na = book_na.get()
    b_y = book_y.get()
    b_w = writer.get()
    b_c = book_c.get()
    b_av = book_av.get()

    if book_isbn.get() == '' or book_na.get() == '' or book_y.get() == '' or book_y.get() == '' \
            or book_c.get() == '' or book_av.get() == '' :
        messagebox.showerror('Error!', 'All Fields of Book''s Details must be entered first too be inserted')  # this is to check if all the entry fields are
        # empty if it is true it'll show a msgbox error
    else:
        mycursor.execute(
            "INSERT INTO library1(ISBN,NAME,DATE_OF_ISSUE,AUTHOR,CODE,AVAILABILITY) VALUES(%s,%s,%s,%s,%s,%s)",
            (b_isbn, b_na, b_y, b_w, b_c, b_av))
        mydb.commit()
        messagebox.showinfo('Message', 'The book has been inserted to the records!')
        mydb.close()

def delete_book():
    b_c = book_c.get()
    mycursor.execute("delete from library.library1 where CODE='" + b_c + "'")
    mydb.commit()
    messagebox.showinfo('Message', 'The book has been deleted from the records!')


def update_book():
    ub_isbn = book_isbn.get()
    ub_na = u_book_na.get()
    ub_y = u_book_y.get()
    ub_w = u_writer.get()
    ub_c = u_book_c.get()
    ub_av = u_book_av.get()
    update_query = """UPDATE library1 SET NAME = %s, DATE_OF_ISSUE = %s, AUTHOR = %s, CODE = %s, AVAILABILITY = %s 
    WHERE ISBN = %s"""
    inputs = (ub_isbn, ub_na, ub_y, ub_w, ub_c, ub_av)
    mycursor.execute(update_query, inputs)
    mydb.commit()
    messagebox.showinfo("Message", "Book updated successfully")
def search_isbn():
    book_search_isbn = isbnentry.get()
    mycursor.execute("SELECT * FROM library1 where ISBN='" + book_search_isbn + "'")
    lst = mycursor.fetchone()
    if lst:
        book_isbn.set(lst[0])
        open_update_window()
    else:
        messagebox.showerror("Error", "Book not found")
root = tk.Tk()

root.geometry("600x400")
root.title("library management system")
mainframe = tk.Frame(root, width=600, height=400, bg="light yellow")
mainframe.pack()
topframe = tk.Frame(mainframe, width=600, height=40, bg="light pink", borderwidth=2, relief="sunken")
topframe.pack_propagate(False)
topframe.pack()
centerframe1 = tk.Frame(mainframe, width=400, height=360, bg="light yellow", borderwidth=2, relief="sunken")
centerframe1.pack_propagate(False)
centerframe1.pack(side=tk.LEFT)
centerframe2 = tk.Frame(mainframe, width=200, height=360, bg="light yellow", borderwidth=2, relief="sunken")
centerframe2.pack_propagate(False)
centerframe2.pack(side=tk.RIGHT)
searchbar = tk.LabelFrame(centerframe2, text="search bar", height=60, width=250, bg="light blue")
searchbar.pack(side=tk.TOP, fill=tk.BOTH)
myentry = tk.Entry(searchbar, width=200)
myentry.pack()
searchbutton = tk.Button(searchbar, text="search", font=("Arial", 8), command=opensearchWindow)
searchbutton.pack(side=tk.RIGHT, padx=10)
imagebar = tk.Frame(centerframe1, width=300, height=300)
imagebar.pack_propagate(False)
imagebar.pack(fill=tk.BOTH)
title1 = tk.Label(imagebar, text="hello user this is blabla library for scientific books ", font=("Arial", 13),
                  bg="light yellow")
title1.pack()
image = Image.open('book.jpeg')
new_image = image.resize((400, 300))
new_image.save('myimage_400.jpeg')
img = ImageTk.PhotoImage(Image.open("myimage_400.jpeg"))
labelimage = tk.Label(imagebar, width=400, height=300, image=img)
labelimage.pack(fill=tk.BOTH)

book_isbn = tk.StringVar()
book_na = tk.StringVar()
book_y = tk.StringVar()
writer = tk.StringVar()
book_c = tk.StringVar()
book_av = tk.StringVar()

u_book_na = tk.StringVar()
u_book_y = tk.StringVar()
u_writer = tk.StringVar()
u_book_c = tk.StringVar()
u_book_av = tk.StringVar()

buttonbook1 = tk.Button(topframe, text="add book", font=("Arial", 12), command=openaddWindow)
buttonbook1.pack(side=tk.LEFT, padx=10)
buttonbook2 = tk.Button(topframe, text="delete book", font=("Arial", 12), command=opendeleteWindow)
buttonbook2.pack(side=tk.LEFT, padx=10)
buttonbook3 = tk.Button(topframe, text="view books", font=("Arial", 12), command=openviewWindow)
buttonbook3.pack(side=tk.LEFT, padx=10)
buttonbook4 = tk.Button(topframe, text="update book", font=("Arial",12), command=isbnn_search_window)
buttonbook4.pack(side=tk.LEFT, padx=10)

root.mainloop()

这是我的 MYSQL 表:

enter image description here

我尝试多次更改更新查询并切换值,但效果不佳。

python mysql tkinter
2个回答
0
投票

我的预感是,这是因为您的函数正在引用已输入到小部件中的 new ISBN 值,并尝试在查询中使用该值。新的 ISBN 尚不存在于数据库中。

您需要保留对记录的old ISBN 编号的引用,并在更新查询中使用它。


0
投票

在网上进一步搜索后,我发现使用的查询语句不正确,正确的答案是使用:

    con = mysql.connector.connect(host="localhost", user="root", password="Y1234",
                                      database="library")
    cursor = con.cursor()
    cursor.execute("update library1 set NAME = '" + b_na + "', DATE_OF_ISSUE='" + b_y + "', AUTHOR='" + b_w + "', CODE='" + b_c + "', AVAILABILITY='" + b_av + "' where ISBN ='" + b_isbn + "'")
    cursor.execute("commit");

    messagebox.showinfo("Status", "Successfully Updated")
    con.close();

而不是:

    '
    update_query = """UPDATE library1 SET NAME = %s, DATE_OF_ISSUE = %s, AUTHOR = %s, CODE = %s, AVAILABILITY = %s 
    WHERE ISBN = %s"""
    inputs = (ub_isbn, ub_na, ub_y, ub_w, ub_c, ub_av)
    mycursor.execute(update_query, inputs)
    mydb.commit()
    messagebox.showinfo("Message", "Book updated successfully")'
© www.soinside.com 2019 - 2024. All rights reserved.