|
|
|
|
@ -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("提示", "目前没有汽车信息。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|