使用tkinter和sqlite3使用treeview更新选定记录中的数据库

2024-09-25 00:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个存储系统,在我的代码中,函数中有一个树视图。我想使用sqlite3更新数据库中选定的记录。程序正在运行,但当我从表中选择一行时,程序显示“名称‘未定义’”。如何访问更新和选择功能中的条目小部件

    def view_form():
        global tree
        top_view_form = tkinter.Frame(viewform, width = 30, bg ="#31CDCC")
        top_view_form.pack(side=tkinter.TOP, fill=tkinter.X)
        bottom_view_form = tkinter.Frame(viewform, width=600, bg="#31CDCC")
        bottom_view_form.pack(side=tkinter.BOTTOM, padx=10, pady=30)
        entry_form = tkinter.Frame(viewform, width = 600, bg = "#31CDCC")
        entry_form.pack(side=tkinter.BOTTOM, padx = 10, pady=10)
        new_entry = tkinter.Frame(viewform, width = 600, bg = "#31CDCC")
        new_entry.pack(side = tkinter.BOTTOM, padx = 20, pady = 5)
        entry = tkinter.Frame(viewform, width = 600, bg = "#31CDCC")
        entry.pack(side = tkinter.BOTTOM, padx = 30, pady = 10)
        mid_view_form = tkinter.Frame(viewform, width = 600, bg = "#31CDCC")
        mid_view_form.pack(side=tkinter.TOP, fill = tkinter.X)
        label_text = tkinter.Label(top_view_form, text="View Vaccines", font=('courier new', 18), bg ="#31CDCC", width = 30)
        label_text.pack(fill=tkinter.X)
        scroll_bar_y = tkinter.Scrollbar(mid_view_form, orient=tkinter.VERTICAL)
        style = ttk.Style()
        # theme
        style.theme_use("clam")
        # configure treeview colors
        style.configure("Treeview",
                        background = "white",
                        foreground = "black",
                        rowheight = 20,
                        fieldbackground = "white")
        # change selected color
        style.map('Treeview',
                  background= [('selected', '#2E86C1')])
        tree = ttk.Treeview(mid_view_form, columns = ("Product ID", "Vaccine Name", "Quantity", "Expiration Date"), selectmode="extended", height = 100, yscrollcommand=scroll_bar_y.set)
        scroll_bar_y.config(command=tree.yview)
        scroll_bar_y.pack(side=tkinter.RIGHT, fill=tkinter.Y)
        tree.heading('Product ID', text="Product ID", anchor=tkinter.W)
        tree.heading('Vaccine Name', text="Vaccine Name", anchor=tkinter.W)
        tree.heading('Quantity', text="Quantity", anchor=tkinter.W)
        tree.heading('Expiration Date', text="Expiration Date", anchor=tkinter.W)
        tree.column('#0', stretch=tkinter.NO, minwidth=0, width=0)
        tree.column('#1', stretch=tkinter.NO, minwidth=0, width=0)
        tree.column('#2', stretch=tkinter.NO, minwidth=0, width=200)
        tree.column('#3', stretch=tkinter.NO, minwidth=0, width=120)
        tree.column('#4', stretch=tkinter.NO, minwidth=0, width=120)
        tree.pack()
        # Entry and Labels
        lbl_vac = tkinter.Label(entry_form, text = "Vaccine Name:", font = ('courier new',8), bg ="#31CDCC")
        lbl_vac.grid(row = 1, column = 0,sticky = tkinter.W)
        vaccine_name = tkinter.Entry(entry_form, textvariable = VACCINE_NAME, font = ('lucida bright', 8), width = 15)
        vaccine_name.grid(row = 1, column = 1)
        lbl_quan = tkinter.Label(entry_form, text = "Quantity:", font = ('courier new', 8), bg = "#31CDCC")
        lbl_quan.grid(row = 1, column = 2, sticky = tkinter.W)
        vaccine_quan = tkinter.Entry(entry_form, textvariable = VACCINE_QUAN, font = ('lucida bright', 8), width = 15)
        vaccine_quan.grid(row = 1, column = 3)
        lbl_exp = tkinter.Label(entry_form, text = "Expiration Date:", font = ('courier new', 8), bg = "#31CDCC")
        lbl_exp.grid(row = 1, column = 4, sticky = tkinter.W)
        vaccine_exp = tkinter.Entry(entry_form, textvariable = VACCINE_EXP, font = ('lucida bright', 8), width = 15)
        vaccine_exp.grid(row=1, column=5)
        search_name = tkinter.Label(entry, text = 'Search Vaccine Name: ', font = ('courier new', 10), bg = "#31CDCC")
        search_name.grid(row = 0, column = 0, sticky = tkinter.W)
        search_entry = tkinter.Entry(entry, textvariable = SEARCH, font = ('lucida bright', 10), width = 20).grid(row = 0, column = 1)
        # Buttons
        btn_search = tkinter.Button(entry, text="Search", width=15, bg="#AAF5EA", command=search)
        btn_search.grid(row = 0, column = 5)
        btn_update = tkinter.Button(bottom_view_form, text="Update", width = 15, bg = "#AAF5EA", command=update)
        btn_update.pack(side=tkinter.LEFT, padx=15)
        btn_del = tkinter.Button(bottom_view_form, text="Delete", width = 15, bg = "#AAF5EA", command=delete)
        btn_del.pack(side=tkinter.LEFT, padx=15)
        btn_reset = tkinter.Button(bottom_view_form, text="Reset", width = 15, bg = "#AAF5EA", command = reset)
        btn_reset.pack(side=tkinter.LEFT, padx=15)
        tree.bind('<ButtonRelease-1>', select)
        display_data()

    def display_data():
        db()
        cursor.execute("SELECT * FROM `vaccines`")
        fetch = cursor.fetchall()
        for data in fetch:
            tree.insert('', 'end', values=(data))
        cursor.close()
        conn.close()

    def update():
        global tree
        name = VACCINE_NAME.get()
        quan = VACCINE_QUAN.get()
        exp = VACCINE_EXP.get()

        for selected in tree.selection():
            vaccine_name.insert(0, selected)
            vaccine_quan.insert(0, selected)
            vaccine_exp.insert(0, selected)
            conn = sqlite3.connect("vac_storage.db")
            cur = conn.cursor()
            cur.execute("UPDATE `vaccines` SET vaccine_name = ?, vaccine_quan = ?, vaccine_exp = ? WHERE `vaccines_id`", (name, quan, exp, tree.set(selected, '#1')))
            conn.commit()
            conn.close()

    def select(event):
        global tree
        print(tree.selection())
        for item in tree.selection():
            content = tree.item(item, 'values')
            vaccine_name.insert(tk.END, content[1])
            vaccine_quan.insert(tk.END, content[2])
            vaccine_exp.insert(tk.END, content[3])

    def view():
        global viewform
        viewform = tkinter.Toplevel()
        viewform.title("Handling Vaccine Storage/View Product")
        viewform.geometry("600x400")
        viewform.resizable(False, False)
        viewform.config(bg = "#31CDCC")
        view_form()

Tags: textformviewtreetkintercolumnwidthside