From 7201ab23f587cc0e324f7487c114668a4d89630f Mon Sep 17 00:00:00 2001 From: wdmtxyh123 <2104295177@qq.com> Date: Wed, 29 May 2024 18:47:24 +0800 Subject: [PATCH] 123 --- 111.py | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 登入.py | 109 -------------------------- 2 files changed, 229 insertions(+), 109 deletions(-) create mode 100644 111.py delete mode 100644 登入.py diff --git a/111.py b/111.py new file mode 100644 index 0000000..135844d --- /dev/null +++ b/111.py @@ -0,0 +1,229 @@ +import tkinter as tk +from tkinter import messagebox, simpledialog +from datetime import datetime +import mysql.connector + +conn = mysql.connector.connect( + host="localhost", + user="root", + password="root", + database="sys" +) + + + +class ParkingLotManager: + def __init__(self): + self.conn = mysql.connector.connect( + host="localhost", + user="root", + password="root", + database="sys" + ) + self.cursor = self.conn.cursor() + + # 初始化时从数据库加载定价规则 + self.load_pricing_rules_from_db() + self.parked_vehicles = {} # 本地缓存,用于快速查询 + + def load_parked_vehicles_from_db(self): + """从数据库加载已停车辆""" + self.cursor.execute("SELECT license_plate, vehicle_type, entry_time FROM parked_vehicles") + parked_data = self.cursor.fetchall() + for plate, vehicle_type, entry_time in parked_data: + self.parked_vehicles[plate] = { + 'vehicle': Vehicle(plate, vehicle_type), + 'entry_time': datetime.strptime(entry_time, "%Y-%m-%d %H:%M:%S") + } + + # 添加一个新方法用于初始化App时加载数据 + def initialize_data_on_login(self): + self.load_parked_vehicles_from_db() + # 在ParkingSystemApp的__init__方法中调用加载数据的方法 + + def open_main_system(parking_manager): + main_system_window = tk.Toplevel(login_window) + main_system_window.title("停车场管理系统 - 主功能") + + # 在创建ParkingSystemApp实例前,先初始化数据 + parking_manager.initialize_data_on_login() + + app = ParkingSystemApp(main_system_window, parking_manager) + + main_system_window.protocol("WM_DELETE_WINDOW", lambda: [main_system_window.destroy(), login_window.destroy()]) + def __init__(self, master, parking_manager): + # ...其他初始化代码... + parking_manager.load_parked_vehicles_from_db() + self.update_ui_vehicles() + + def park_vehicle(self, vehicle): + # 除了现有逻辑,还需要在数据库中记录入场时间 + sql = "INSERT INTO parked_vehicles (license_plate, vehicle_type, entry_time) VALUES (%s, %s, %s)" + val = (vehicle.get_license_plate(), vehicle.get_vehicle_type(), datetime.now()) + self.cursor.execute(sql, val) + self.conn.commit() + self.parked_vehicles[vehicle.get_license_plate()] = {'vehicle': vehicle, 'entry_time': datetime.now()} + + def unpark_vehicle(self, license_plate): + # 除了现有逻辑,更新数据库中的出场时间和费用 + vehicle_info = self.parked_vehicles.get(license_plate) + if vehicle_info: + exit_time = datetime.now() + hours_parked = (exit_time - vehicle_info['entry_time']).total_seconds() / 3600 + vehicle_type = vehicle_info['vehicle'].get_vehicle_type() + fee = self.pricing_rules[vehicle_type].calculate_fee(hours_parked) + + sql_update = "UPDATE parked_vehicles SET exit_time=%s, total_fee=%s WHERE license_plate=%s" + val = (exit_time, fee, license_plate) + self.cursor.execute(sql_update, val) + self.conn.commit() + + del self.parked_vehicles[license_plate] + return fee + else: + raise ValueError("Vehicle not found in the system.") + + + + + +class PricingRule: + def __init__(self, vehicle_type, hourly_rate, max_daily_rate=None): + self.vehicle_type = vehicle_type + self.hourly_rate = hourly_rate + self.max_daily_rate = max_daily_rate or float('inf') + + def calculate_fee(self, hours_parked): + fee = hours_parked * self.hourly_rate + if self.max_daily_rate and fee > self.max_daily_rate: + return self.max_daily_rate + return fee + +class Vehicle: + def __init__(self, license_plate, vehicle_type): + self.license_plate = license_plate + self.vehicle_type = vehicle_type + + def get_license_plate(self): + return self.license_plate + + def get_vehicle_type(self): + return self.vehicle_type + +class ParkingLotManager: + def __init__(self): + self.pricing_rules = {} + self.parked_vehicles = {} + + def add_pricing_rule(self, vehicle_type, hourly_rate, max_daily_rate=None): + self.pricing_rules[vehicle_type] = PricingRule(vehicle_type, hourly_rate, max_daily_rate) + + def park_vehicle(self, vehicle): + self.parked_vehicles[vehicle.get_license_plate()] = {'vehicle': vehicle, 'entry_time': datetime.now()} + + def unpark_vehicle(self, license_plate): + entry_time = self.parked_vehicles[license_plate]['entry_time'] + parked_hours = (datetime.now() - entry_time).total_seconds() / 3600 + vehicle_type = self.parked_vehicles[license_plate]['vehicle'].get_vehicle_type() + + if vehicle_type in self.pricing_rules: + fee = self.pricing_rules[vehicle_type].calculate_fee(parked_hours) + del self.parked_vehicles[license_plate] + return fee + else: + raise ValueError("No pricing rule for this vehicle type.") + +class ParkingSystemApp: + def __init__(self, master, parking_manager): + self.master = master + self.parking_manager = parking_manager + master.title("停车场管理系统") + + self.vehicle_listbox = tk.Listbox(master, width=50) + self.vehicle_listbox.pack(pady=10) + + self.search_entry = tk.Entry(master) + self.search_entry.pack(pady=5) + + tk.Button(master, text="查询车辆", command=self.search_vehicle).pack(side=tk.LEFT, padx=5) + tk.Button(master, text="录入入场", command=self.add_vehicle).pack(side=tk.LEFT, padx=5) + tk.Button(master, text="删除出场", command=self.remove_vehicle).pack(side=tk.LEFT, padx=5) + tk.Button(master, text="退出系统", command=self.quit_app).pack(side=tk.RIGHT, padx=5) + + # 示例数据,实际应用中应从数据库读取 + self.vehicles = ["ABC123", "XYZ789", "CDE456"] + self.update_ui_vehicles() + + def update_ui_vehicles(self): + self.vehicle_listbox.delete(0, tk.END) + for plate in self.parking_manager.parked_vehicles.keys(): + self.vehicle_listbox.insert(tk.END, plate) + + def search_vehicle(self): + query = self.search_entry.get().strip() + if query: + self.vehicle_listbox.delete(0, tk.END) + for plate in self.parking_manager.parked_vehicles.keys(): + if query.lower() in plate.lower(): + self.vehicle_listbox.insert(tk.END, plate) + + def add_vehicle(self): + new_vehicle = simpledialog.askstring("录入车辆", "请输入车牌号:") + if new_vehicle and new_vehicle not in self.vehicles: + car = Vehicle(new_vehicle, "car") + parking_manager.park_vehicle(car) # 假设park_vehicle方法已更新数据库 + self.update_ui_vehicles() # 添加车辆后立即刷新UI + + def remove_vehicle(self): + selected = self.vehicle_listbox.curselection() + if selected: + plate = self.vehicle_listbox.get(selected[0]) + fee = parking_manager.unpark_vehicle(plate) + messagebox.showinfo("停车费用", f"车辆 {plate} 的停车费用为:{fee}元") + self.update_ui_vehicles() # 移除车辆后刷新UI + + def quit_app(self): + self.master.destroy() + +def login_success(username_entry, password_entry, parking_manager): + expected_username = "1" + expected_password = "1" # 这里设置具体的密码 + + entered_username = username_entry.get().strip() + entered_password = password_entry.get().strip() + + if entered_username == expected_username and entered_password == expected_password: + login_window.withdraw() + open_main_system(parking_manager) + else: + messagebox.showerror("登录失败", "用户名或密码错误,请重试。") + +def open_main_system(parking_manager): + main_system_window = tk.Toplevel(login_window) + main_system_window.title("停车场管理系统 - 主功能") + app = ParkingSystemApp(main_system_window, parking_manager) + + main_system_window.protocol("WM_DELETE_WINDOW", lambda: [main_system_window.destroy(), login_window.destroy()]) + +# 初始化停车场管理器 +parking_manager = ParkingLotManager() +parking_manager.add_pricing_rule("car", 2, 20) # 小型车每小时2元,每日最高20元 + +# 登录界面 +login_window = tk.Tk() +login_window.title("停车场管理系统 - 登录") + +label_username = tk.Label(login_window, text="用户名:") +label_username.pack() +entry_username = tk.Entry(login_window) +entry_username.pack() + +label_password = tk.Label(login_window, text="密码:") +label_password.pack() +entry_password = tk.Entry(login_window, show="*") +entry_password.pack() + +button_login = tk.Button(login_window, text="登录", command=lambda: login_success(entry_username, entry_password, parking_manager)) +button_login.pack(pady=10) + +login_window.mainloop() \ No newline at end of file diff --git a/登入.py b/登入.py deleted file mode 100644 index ff2adc5..0000000 --- a/登入.py +++ /dev/null @@ -1,109 +0,0 @@ -import tkinter as tk -from tkinter import messagebox, Toplevel - - -# 假设这是你的登录函数,现在增加成功登录后的逻辑 -def login_success(): - global login_window - username = entry_username.get() - password = entry_password.get() - - if username == "1" and password == "1": - # 隐藏登录窗口 - login_window.withdraw() - - # 打开新的窗口作为主功能页面 - open_main_system() - else: - messagebox.showerror("登录失败", "用户名或密码错误,请重试。") - - -def open_main_system(): - # 主功能页面的实现 - main_system_window = Toplevel(login_window) - main_system_window.title("停车场管理系统 - 主功能") - - label_welcome = tk.Label(main_system_window, text="欢迎使用停车场管理系统!") - label_welcome.pack(pady=10) - - class ParkingSystemApp: - def __init__(self, master): - self.master = master - master.title("停车场管理系统") - - self.vehicle_listbox = tk.Listbox(master, width=50) - self.vehicle_listbox.pack(pady=10) - - self.search_entry = tk.Entry(master) - self.search_entry.pack(pady=5) - - tk.Button(master, text="查询车辆", command=self.search_vehicle).pack(side=tk.LEFT, padx=5) - tk.Button(master, text="录入入场", command=self.add_vehicle).pack(side=tk.LEFT, padx=5) - tk.Button(master, text="删除出场", command=self.remove_vehicle).pack(side=tk.LEFT, padx=5) - tk.Button(master, text="退出系统", command=self.quit_app).pack(side=tk.RIGHT, padx=5) - - # 示例数据,实际应用中应从数据库读取 - self.vehicles = ["ABC123", "XYZ789", "CDE456"] - - # 初始加载车辆列表 - for vehicle in self.vehicles: - self.vehicle_listbox.insert(tk.END, vehicle) - - def search_vehicle(self): - query = self.search_entry.get().strip() - if query: - self.vehicle_listbox.delete(0, tk.END) - for vehicle in self.vehicles: - if query.lower() in vehicle.lower(): - self.vehicle_listbox.insert(tk.END, vehicle) - - def add_vehicle(self): - new_vehicle = simpledialog.askstring("录入车辆", "请输入车牌号:") - if new_vehicle and new_vehicle not in self.vehicles: - self.vehicles.append(new_vehicle) - self.vehicle_listbox.insert(tk.END, new_vehicle) - - def remove_vehicle(self): - selected = self.vehicle_listbox.curselection() - if selected: - vehicle_to_remove = self.vehicle_listbox.get(selected[0]) - confirm = messagebox.askyesno("确认删除", f"确定要删除车辆 {vehicle_to_remove}?") - if confirm: - self.vehicles.remove(vehicle_to_remove) - self.vehicle_listbox.delete(selected) - - def quit_app(self): - self.master.destroy() - - def main(): - root = tk.Tk() - app = ParkingSystemApp(root) - root.mainloop() - - if __name__ == "__main__": - main() - # 这里可以添加更多功能按钮和控件,如之前示例中的浏览、查询、录入、删除功能 - - # 注意:关闭此窗口时,可能需要同时关闭登录窗口 - main_system_window.protocol("WM_DELETE_WINDOW", lambda: [main_system_window.destroy(), login_window.destroy()]) - - -# 原始登录界面的创建 -login_window = tk.Tk() -login_window.title("停车场管理系统 - 登录") - -# 登录界面的元素定义... -label_username = tk.Label(login_window, text="用户名:") -label_username.pack() -entry_username = tk.Entry(login_window) -entry_username.pack() - -label_password = tk.Label(login_window, text="密码:") -label_password.pack() -entry_password = tk.Entry(login_window, show="*") -entry_password.pack() - -button_login = tk.Button(login_window, text="登录", command=login_success) -button_login.pack(pady=10) - -login_window.mainloop()