You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多窗口中使用共享同一数据库的Treeview?数据库崩溃求助

多窗口共享SQLite数据库时崩溃,实现点击按钮弹出带Treeview的窗口

我正在完成学校的期末项目,希望主界面点击按钮弹出的每个新窗口都能加载Treeview,且所有窗口共享同一个SQLite数据库。但将相关代码复制到每个按钮的事件处理逻辑中时,数据库出现崩溃问题。

界面说明

  • 主窗口:包含多个功能按钮,点击可打开对应操作窗口
  • 添加项按钮对应的Treeview窗口:包含Item No.、Item Name、Price、Quantity输入框,Add/Update/Delete操作按钮,以及展示库存数据的Treeview

相关代码

my_tree = ttk.Treeview(add_window)
storeName = "Add an Item"


def reverse(tuples):
    new_tup = tuples[::-1]
    return new_tup


def insert(id, name, price, quantity):
    conn = sqlite3.connect("eclist1.db")
    cursor = conn.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS 
    inventory(itemId TEXT, itemName TEXT, itemPrice TEXT
              , itemQuantity TEXT)""")

    cursor.execute("INSERT INTO inventory VALUES ('" + str(id) +
                   "','" + str(name) + "','" + str(price) + "','"
                   + str(quantity) + "')")
    conn.commit()


def delete(data):
    conn = sqlite3.connect("eclist1.db")
    cursor = conn.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS 
        inventory(itemId TEXT, itemName TEXT, itemPrice TEXT,
                  itemQuantity TEXT)""")

    cursor.execute("DELETE FROM inventory WHERE itemId = '" +
                   str(data) + "'")
    conn.commit()


def update(id, name, price, quantity, idName):
    conn = sqlite3.connect("eclist1.db")
    cursor = conn.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS 
        inventory(itemId TEXT, itemName TEXT, itemPrice TEXT,
                  itemQuantity TEXT)""")

    cursor.execute("UPDATE inventory SET itemId = '" 
                   + str(id) + "', itemName = '" 
                   + str(name) + "', itemPrice = '" 
                   + str(price) + "', itemQuantity = '" 
                   + str(quantity) + "' WHERE itemId='"
                   +str(idName)+"'")
    conn.commit()


def read():
    conn = sqlite3.connect("eclist1.db")
    cursor = conn.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS 
        inventory(itemId TEXT, itemName TEXT, itemPrice TEXT,
                  itemQuantity TEXT)""")

    cursor.execute("SELECT * FROM inventory")
    results = cursor.fetchall()
    conn.commit()
    return results


def insert_data():
    itemId = str(entryId.get())
    itemName = str(entryName.get())
    itemPrice = str(entryPrice.get())
    itemQuantity = str(entryQuantity.get())
    if itemId == "" or itemName == " ":
        print("Error Inserting Item Number")
    if itemName == "" or itemName == " ":
        print("Error Inserting Name")
    if itemPrice == "" or itemPrice == " ":
        print("Error Inserting Price")
    if itemQuantity == "" or itemQuantity == " ":
        print("Error Inserting Quantity")
    else:
        insert(str(itemId), str(itemName), str(itemPrice),
               str(itemQuantity))

    for data in my_tree.get_children():
        my_tree.delete(data)

    for result in reverse(read()):
        my_tree.insert(parent='', index='end', iid=result, text="",
                       values=(result), tag="orow")

    my_tree.tag_configure('orow', background='#EEEEEE')
    my_tree.pack()
    my_tree.place(relx=0.09,rely=0.55)


def delete_data():
    selected_item = my_tree.selection()[0]
    deleteData = str(my_tree.item(selected_item)['values'][0])
    delete(deleteData)

    for data in my_tree.get_children():
        my_tree.delete(data)

    for result in reverse(read()):
        my_tree.insert(parent='', index='end', iid=result, text="",
                       values=(result), tag="orow")

    my_tree.tag_configure('orow', background='#EEEEEE')
    my_tree.pack()
    my_tree.place(relx=0.09,rely=0.55)


def update_data():
    selected_item = my_tree.selection()[0]
    update_name = my_tree.item(selected_item)['values'][0]
    update(entryId.get(), entryName.get(), entryPrice.get(),
           entryQuantity.get(), update_name)

    for data in my_tree.get_children():
        my_tree.delete(data)

    for result in reverse(read()):
        my_tree.insert(parent='', index='end', iid=result, text="",
                       values=(result), tag="orow")

    my_tree.tag_configure('orow', background='#EEEEEE')
    my_tree.pack()
    my_tree.place(relx=0.09,rely=0.55)


titleLabel = Label(add_window, text=storeName,
                   font=('Roboto', 30, 'bold'), bd=2, bg='#FFC2A6')
titleLabel.pack()
titleLabel.place(relx=0.34,rely=0.1)

idLabel = Label(add_window, text="Item No.", font=('Roboto bold', 15),
                bg='#FFC2A6')
nameLabel = Label(add_window, text="Item Name", font=('Roboto bold', 15),
                  bg='#FFC2A6')
priceLabel = Label(add_window, text="Price", font=('Roboto bold', 15),
                   bg='#FFC2A6')
quantityLabel = Label(add_window, text="Quantity",
                      font=('Roboto bold', 15), bg='#FFC2A6')
idLabel.pack()
nameLabel.pack()
priceLabel.pack()
quantityLabel.pack()
idLabel.place(relx=0.1,rely=0.20)
nameLabel.place(relx=0.1,rely=0.25)
priceLabel.place(relx=0.1,rely=0.30)
quantityLabel.place(relx=0.1,rely=0.35)

entryId = Entry(add_window, width=25, bd=5, font=('Roboto', 15, 'bold'))
entryName = Entry(add_window, width=25, bd=5, font=('Roboto', 15, 'bold'))
entryPrice = Entry(add_window, width=25, bd=5
                   , font=('Roboto', 15, 'bold'))
entryQuantity = Entry(add_window, width=25, bd=5,
                      font=('Roboto', 15, 'bold'))
entryId.pack()
entryName.pack()
entryPrice.pack()
entryQuantity.pack()
entryId.place(relx=0.31,rely=0.20)
entryName.place(relx=0.31,rely=0.25)
entryPrice.place(relx=0.31,rely=0.30)
entryQuantity.place(relx=0.31,rely=0.35)

buttonEnter = Button(
    add_window, text="Add", padx=5, pady=5, width=5,
    bd=3, font=('Roboto', 15), bg="#DAEAF6", command=insert_data)
buttonEnter.pack()
buttonEnter.place(relx=0.35,rely=0.44)

buttonUpdate = Button(
    add_window, text="Update", padx=5, pady=5, width=5,
    bd=3, font=('Roboto', 15), bg="#DDEDEA", command=update_data)
buttonUpdate.pack()
buttonUpdate.place(relx=0.45,rely=0.44)

buttonDelete = Button(
    add_window, text="Delete", padx=5, pady=5, width=5,
    bd=3, font=('Roboto', 15), bg="#FCE1E4", command=delete_data)
buttonDelete.pack()
buttonDelete.place(relx=0.55,rely=0.44)

style = ttk.Style()
style.configure("Treeview.Heading", font=('Roboto', 15, 'bold'))

my_tree['columns'] = ("ID", "Name", "Price", "Quantity")
my_tree.column("#0", width=0, stretch=NO)
my_tree.column("ID", anchor=W, width=100)
my_tree.column("Name", anchor=W, width=200)
my_tree.column("Price", anchor=W, width=150)
my_tree.column("Quantity", anchor=W, width=150)
my_tree.heading("ID", text="Item No.", anchor=W)
my_tree.heading("Name", text="Item Name", anchor=W)
my_tree.heading("Price", text="Price", anchor=W)
my_tree.heading("Quantity", text="Quantity", anchor=W)

for data in my_tree.get_children():
    my_tree.delete(data)

for result in reverse(read()):
    #error
    my_tree.insert(parent='', index='end', iid=0, text="",
                   values=(result), tag="orow")

my_tree.tag_configure('orow', background='#EEEEEE',
                      font=('Roboto bold', 15))
my_tree.pack()
my_tree.place(relx=0.09,rely=0.55)

期望

点击按钮时能正常弹出带有Treeview的新窗口,所有窗口操作同一数据库时不会出现崩溃问题。

内容的提问来源于stack exchange,提问作者Dirk Nash Orimaco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:38:10