【问题标题】:Deleting selected treeview items from Sqlite Database从 Sqlite 数据库中删除选定的树视图项目
【发布时间】:2020-07-22 21:27:09
【问题描述】:

我正在尝试创建一个数据库系统,我可以在其中保存和删除前端(python/tkinter)和后端(sqlite)的用户记录。到目前为止,我已经设法让前端工作。单击按钮时,数据(输入到输入框)被保存到树中。删除按钮将清除树和条目框中的数据。

现在我正在努力让后端正常工作。虽然我能够将数据保存到 sqlite 数据库,但我不知道在 tkinter 树中选择时如何从 sqlite 数据库中删除项目。下面是代码的sn-p。请注意,我为名为“Backend”的后端使用了一个单独的文件。

from tkinter import *
import tkinter.messagebox
import Backend

#frontend

root = Tk()

ID = StringVar()
Name= StringVar()
Age = StringVar()
BirthDate = StringVar()

def SaveData():
    if(len(ID.get())!=0):
       Backend.saveUserRec(ID.get(),Name.get(), Age.get(), BirthDate.get())
       tree.insert('', 'end', values=(ID.get(),Name.get(), Age.get(), BirthDate.get()))
    else:
        IDnumber= messagebox.showinfo ("","Please enter an ID number")

def DeleteData():
    try:
        selected_item = tree.selection()[0] ## get selected item from tree
        messageDelete= tkinter.messagebox.askyesno ("","Do you want to permanently delete this record?")
        if messageDelete > 0:
                tree.delete(selected_item)
                Clear()
                Backend.DeleteRecord()
    except Exception:
        pass

def Clear():
    ID.set("")
    Name.set("")
    Age.set("")
    BirthDate.set("")

btnSaveData = Button(ButtonFrame, text='Save', font=('arial',12), height=1, width=16, bd=2, padx=13, command=SaveData)
btnSaveData.grid(row=0,column=0)

btnDeleteData = Button(ButtonFrame, text='Delete', font=('arial',12), height=1, width=16, bd=2, padx=13, command=DeleteData)
btnDeleteData.grid(row=0,column=1)

root.mainloop()

#backend

import sqlite3

def userrecord():
    con =sqlite3.connect("userRecord.db")
    cur = con.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS userRecord(userid INTEGER PRIMARY KEY, \
    ID text, Name text, Age text, BirthDate text)")
    con.commit()
    con.close()

def saveUserRec(ID, Name, Age, BirthDate):
    con =sqlite3.connect("userRecord.db")
    cur = con.cursor()
    userrecord()
    cur.execute("INSERT INTO userRecord VALUES (null, ?, ?, ?, ?)”, (ID, Name, Age, BirthDate))
    con.commit()
    con.close()

def DeleteRecord():
    con =sqlite3.connect("userRecord.db")
    cur = con.cursor()
    cur.execute("DELETE FROM userRecord WHERE userid=?", (userid, tree.set(selected_item, '#1')))
    con.commit()
    con.close()

【问题讨论】:

  • 所以你需要知道如何将所选数据放入我猜的变量中。 this 有没有给你一个初步的想法

标签: python sqlite tkinter


【解决方案1】:

为了从数据库中删除树视图中的选中项,需要将选中项的唯一userid传递给后端DeleteRecord()函数:

def DeleteRecord(userid):
    con = sqlite3.connect("userRecord.db")
    cur = con.cursor()
    cur.execute("DELETE FROM userRecord WHERE userid = ?", (userid,))
    con.commit()
    con.close()

那么如何获取选中项的userid呢?目前您的代码在添加新项目时没有userid 信息。后端saveUserRec()函数需要返回新插入记录的userid:

def saveUserRec(ID, Name, Age, BirthDate):
    con = sqlite3.connect("userRecord.db")
    cur = con.cursor()
    Backend.userrecord()
    cur.execute("INSERT INTO userRecord VALUES (null, ?, ?, ?, ?)", (ID, Name, Age, BirthDate))
    con.commit()
    con.close()
    # return the userid of newly added record
    return cur.lastrowid

并更新SaveData() 以通过Treeview.insert() 的iid 选项将userid 包含到树视图项中:

def SaveData():
    if len(ID.get()) != 0:
       # save the record to database and get the userid for the record
       userid = Backend.saveUserRec(ID.get(), Name.get(), Age.get(), BirthDate.get())
       tree.insert('', 'end', iid=userid, values=(ID.get(), Name.get(), Age.get(), BirthDate.get()))
    else:
        IDnumber = messagebox.showinfo("Error", "Please enter an ID number")

现在您可以在要删除时获取所选项目的userid:

def DeleteData():
    try:
        userid = tree.selection()[0] ## get selected item from tree
        print(userid)
        messageDelete = messagebox.askyesno("Confirmation", "Do you want to permanently delete this record?")
        if messageDelete > 0:
                tree.delete(userid)
                Clear()
                Backend.DeleteRecord(userid)
    except Exception as e:
        print(e)

【讨论】:

  • 这符合预期,感谢您的帮助!
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多