From e3414804ffe5a54a1097dddac63d34a2b3f0d1d0 Mon Sep 17 00:00:00 2001 From: Buping <2107013744@qq.com> Date: Wed, 29 May 2024 17:00:55 +0800 Subject: [PATCH] 0529 --- 功能界面.py | 82 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/功能界面.py b/功能界面.py index c7aae57..321f611 100644 --- a/功能界面.py +++ b/功能界面.py @@ -2,12 +2,21 @@ import tkinter as tk from tkinter import messagebox from tkinter import simpledialog import os - +import pymysql +from tkinter import ttk # 添加这一行来导入ttk class CarSalesSystem: def __init__(self, master): self.master = master master.title("汽车销售系统") - + # 初始化数据库连接和游标 + self.db_connect = pymysql.connect( + host="localhost", + user="root", + password="a123456a", + charset="utf8", + database="汽车" # 直接指定数据库,无需执行use语句 + ) + self.cursor = self.db_connect.cursor() self.cars = [] # 这里简单用列表存储汽车信息,实际应用中建议使用数据库 # 创建界面元素 @@ -25,24 +34,37 @@ class CarSalesSystem: self.button_view.pack(pady=5) def add_car(self): - car_info = simpledialog.askstring("添加汽车", "请输入汽车信息,格式:品牌,型号,价格,颜色").strip() + car_info = simpledialog.askstring("添加汽车", "请输入汽车信息,格式:品牌,型号,价格,颜色") if car_info: - self.cars.append(car_info.split(',')) - messagebox.showinfo("成功", "汽车添加成功!") + # 解析用户输入的汽车信息 + pp, xh, jg, color = car_info.split(',') + + # 预防SQL注入,使用参数化查询 + insert_sql = "INSERT INTO tj (pp, xh, jg, color) VALUES (%s, %s, %s, %s)" + try: + self.cursor.execute(insert_sql, (pp, xh, float(jg), color)) # 注意价格转换为浮点数 + self.db_connect.commit() # 提交事务,保存更改 + messagebox.showinfo("成功", "汽车添加成功,并已保存至数据库!") + except Exception as e: + messagebox.showerror("错误", f"添加汽车到数据库时发生错误:{e}") + self.db_connect.rollback() # 发生错误时回滚事务 + + # 注意:这里假设你已经有了一个名为tj的表用于存储汽车信息,且字段对应为(pp, xh, jg, color) + # 实际使用时请根据你的数据库表结构进行调整 def delete_car(self): - car_to_delete = simpledialog.askstring("删除汽车", "请输入要删除的汽车型号:").strip() - print(f"尝试删除的型号: {car_to_delete}, 当前所有汽车信息: {self.cars}") + car_to_delete = simpledialog.askstring("删除汽车", "请输入要删除的汽车型号:") if car_to_delete: - for car in self.cars: - if len(car) >= 2 and car[1] == car_to_delete: - self.cars.remove(car) - messagebox.showinfo("成功", f"{car_to_delete}已从系统中删除。") - break - else: - messagebox.showerror("错误", f"未找到型号为{car_to_delete}的汽车。") - else: - messagebox.showwarning("警告", "请输入有效的汽车型号进行删除操作。") + # 预防SQL注入,使用参数化查询 + delete_sql = "DELETE FROM tj WHERE xh = %s" + + try: + self.cursor.execute(delete_sql, (car_to_delete,)) + self.db_connect.commit() # 提交事务,确保删除操作生效 + messagebox.showinfo("成功", f"{car_to_delete}已从数据库中删除。") + except Exception as e: + messagebox.showerror("错误", f"删除汽车信息时发生错误:{e}") + self.db_connect.rollback() # 发生错误时回滚事务,保持数据库一致性 def edit_car(self): edit_car_model = simpledialog.askstring("编辑汽车", "请输入要编辑的汽车型号:") @@ -58,10 +80,30 @@ class CarSalesSystem: messagebox.showerror("错误", f"未找到型号为{edit_car_model}的汽车。") def view_cars(self): - if self.cars: - car_details = "\n".join([", ".join(car) for car in self.cars]) - messagebox.showinfo("所有汽车信息", car_details) - else: + # 使用Treeview显示数据 + view_window = tk.Toplevel(self.master) + view_window.title("所有汽车信息") + + columns = ("品牌", "型号", "价格", "颜色") + tree = ttk.Treeview(view_window, columns=columns, show="headings") + + for column in columns: + tree.heading(column, text=column) + tree.column(column, width=100, anchor="center") + + # 从数据库获取数据并插入Treeview + sql_show = "SELECT * FROM tj" + self.cursor.execute(sql_show) + rows = self.cursor.fetchall() + for row in rows: + tree.insert("", "end", values=row) + + tree.pack(fill=tk.BOTH, expand=True) + scrollbar = ttk.Scrollbar(view_window, orient="vertical", command=tree.yview) + tree.configure(yscrollcommand=scrollbar.set) + scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + + if not rows: messagebox.showinfo("提示", "目前没有汽车信息。")