wdmtxyh123 1 year ago
parent e78d89e69e
commit 7201ab23f5

229
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()

@ -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()
Loading…
Cancel
Save