如何在多窗口中使用共享同一数据库的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
相关产品推荐
相关产品推荐

