import pymysql from tkinter import * from tkinter import messagebox from tkinter import ttk db_config = { 'host': 'localhost', 'user': 'your_username', 'password': 'your_password', 'database': 'supermarket_db' } def init_db(): conn = pymysql.connect(**db_config) cursor = conn.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, price DECIMAL(10, 2) NOT NULL, stock INT NOT NULL ) """) conn.commit() conn.close() def add_product(name, price, stock): conn = pymysql.connect(**db_config) cursor = conn.cursor() cursor.execute("INSERT INTO products (name, price, stock) VALUES (%s, %s, %s)", (name, price, stock)) conn.commit() conn.close() def delete_product(id): conn = pymysql.connect(**db_config) cursor = conn.cursor() cursor.execute("DELETE FROM products WHERE id=%s", (id,)) conn.commit() conn.close() def fetch_products(): conn = pymysql.connect(**db_config) cursor = conn.cursor() cursor.execute("SELECT * FROM products") rows = cursor.fetchall() cursor.close() conn.close() return rows def on_add_click(): name = name_entry.get() price = price_entry.get() stock = stock_entry.get() if name and price and stock: try: price = float(price) stock = int(stock) add_product(name, price, stock) messagebox.showinfo("成功", "商品添加成功!") refresh_table() except ValueError: messagebox.showerror("错误", "价格必须为数字,库存必须为整数。") def on_delete_click(): selected_item = table.selection() if selected_item: id = table.item(selected_item)['values'][0] delete_product(id) messagebox.showinfo("成功", "商品删除成功!") refresh_table() def refresh_table(): for item in table.get_children(): table.delete(item) for row in fetch_products(): table.insert('', END, values=row) init_db() root = Tk() root.title("超市商品管理系统") Label(root, text="商品名称").grid(row=0, column=0) name_entry = Entry(root) name_entry.grid(row=0, column=1) Label(root, text="价格").grid(row=1, column=0) price_entry = Entry(root) price_entry.grid(row=1, column=1) Label(root, text="库存").grid(row=2, column=0) stock_entry = Entry(root) stock_entry.grid(row=2, column=1) Button(root, text="添加商品", command=on_add_click).grid(row=3, column=0, columnspan=2) Button(root, text="刷新列表", command=refresh_table).grid(row=4, column=0, columnspan=2) table = ttk.Treeview(root, columns=('ID', 'Name', 'Price', 'Stock'), show='headings') table.heading('ID', text='ID') table.heading('Name', text='名称') table.heading('Price', text='价格') table.heading('Stock', text='库存') table.grid(row=5, column=0, columnspan=2) Button(root, text="删除选中商品", command=on_delete_click).grid(row=6, column=0, columnspan=2) refresh_table() root.mainloop()
效果如下:
优点:
①模块化设计:代码结构清晰,将数据库操作(init_db, add_product, delete_product, fetch_products)与界面操作分开,便于维护和扩展。
②错误处理:在on_add_click函数中,尝试将价格和库存转换为相应的类型,并通过异常处理捕捉转换失败的情况,提示用户输入正确的数据格式,提高了程序的健壮性。
③即时反馈:使用messagebox弹窗提供即时的操作反馈,如“商品添加成功!”或“商品删除成功!”,增强了用户体验。
④动态数据展示:通过Treeview组件动态展示数据库中的商品信息,并实现了即时刷新功能,用户可以在添加或删除商品后立即看到更新的结果。
⑤简洁直观的用户界面:界面设计简洁明了,用户可以轻松地添加新商品、刷新列表查看最新数据,以及选择并删除已有商品,操作流程简单易懂。
⑥数据库表的自动创建:通过init_db函数,如果数据库表不存在,则会自动创建,简化了首次部署或数据库迁移的步骤。
⑦安全的数据库连接管理:使用with语句或直接关闭连接的方式管理数据库连接,确保每次操作后资源被妥善释放,减少了资源泄露的风险。
⑧易于扩展:代码基础框架搭建得较为合理,如果需要增加更多功能,如修改商品信息、查询特定商品等,可以在现有基础上较为容易地进行扩展。