|
|
|
|
import tkinter as tk
|
|
|
|
|
from tkinter import messagebox
|
|
|
|
|
from tkinter import simpledialog
|
|
|
|
|
from Car import Car
|
|
|
|
|
from ParkManage import ParkManage # 确保你的模块路径正确
|
|
|
|
|
from User import User
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 初始化停车场管理
|
|
|
|
|
park_manage_instance = ParkManage()
|
|
|
|
|
park = ParkManage()
|
|
|
|
|
# 创建一个用户实例
|
|
|
|
|
user1 = User('Alice', 'P@ssw0rd')
|
|
|
|
|
|
|
|
|
|
# 打印用户信息
|
|
|
|
|
print(user1)
|
|
|
|
|
|
|
|
|
|
# 修改用户密码
|
|
|
|
|
user1.change_password('NewP@ssw0rd')
|
|
|
|
|
|
|
|
|
|
# 提升用户为管理员
|
|
|
|
|
user1.promote_to_admin()
|
|
|
|
|
|
|
|
|
|
# 再次打印用户信息,查看角色是否变化
|
|
|
|
|
print(user1)
|
|
|
|
|
|
|
|
|
|
# 降级用户为普通用户
|
|
|
|
|
user1.demote_to_user()
|
|
|
|
|
|
|
|
|
|
# 最后一次打印用户信息
|
|
|
|
|
print(user1)
|
|
|
|
|
isAdmin = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_park_click():
|
|
|
|
|
"""处理停车操作的回调函数"""
|
|
|
|
|
# 弹出对话框让用户输入车牌号
|
|
|
|
|
license_plate = simpledialog.askstring("停车", "请输入车牌号:")
|
|
|
|
|
if license_plate:
|
|
|
|
|
# 调用park对象的park方法,传入用户输入的车牌号
|
|
|
|
|
success = park.park(license_plate)
|
|
|
|
|
if success:
|
|
|
|
|
messagebox.showinfo("停车成功", f"车牌号{license_plate}的车辆已成功停放。")
|
|
|
|
|
else:
|
|
|
|
|
messagebox.showerror("停车失败", "停车过程中出现问题,请重试。")
|
|
|
|
|
else:
|
|
|
|
|
messagebox.showwarning("警告", "车牌号不能为空,请重新输入。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_pickup_click():
|
|
|
|
|
"""处理取车操作的回调函数"""
|
|
|
|
|
# 弹出对话框让用户输入车牌号
|
|
|
|
|
license_plate = simpledialog.askstring("取车", "请输入车牌号:")
|
|
|
|
|
if license_plate:
|
|
|
|
|
# 调用park对象的pickup方法,传入用户输入的车牌号尝试取车
|
|
|
|
|
success = park.pickup(license_plate)
|
|
|
|
|
if success:
|
|
|
|
|
messagebox.showinfo("取车成功", f"车牌号为{license_plate}的车辆已成功取走。")
|
|
|
|
|
else:
|
|
|
|
|
messagebox.showerror("取车失败", f"车牌号为{license_plate}的车辆取车失败。请检查车牌号是否正确或车辆是否已取走。")
|
|
|
|
|
else:
|
|
|
|
|
messagebox.showwarning("警告", "车牌号不能为空,请重新输入。")
|
|
|
|
|
|
|
|
|
|
def on_inquire_click():
|
|
|
|
|
"""处理查询车辆信息操作的回调函数"""
|
|
|
|
|
# 弹出对话框让用户输入车牌号
|
|
|
|
|
license_plate = simpledialog.askstring("查询车辆信息", "请输入车牌号:")
|
|
|
|
|
if license_plate:
|
|
|
|
|
try:
|
|
|
|
|
# 调用park对象的query_car_info方法,传入用户输入的车牌号查询车辆信息
|
|
|
|
|
car_info = park.query_car_info(license_plate)
|
|
|
|
|
if car_info:
|
|
|
|
|
# 假设query_car_info返回车辆信息的字典,展示相关信息
|
|
|
|
|
message = (
|
|
|
|
|
f"车牌号: {car_info['license_plate']}\n"
|
|
|
|
|
|
|
|
|
|
f"停放时间: {car_info['parked_time'].strftime('%Y-%m-%d %H:%M:%S')}\n"
|
|
|
|
|
f"取车时间: {car_info['picked_up_time'].strftime('%Y-%m-%d %H:%M:%S') if car_info['picked_up_time'] else '未取车'}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
messagebox.showerror("查询错误", f"查询过程中发生错误: {e}")
|
|
|
|
|
else:
|
|
|
|
|
messagebox.showwarning("警告", "车牌号不能为空,请重新输入。")
|
|
|
|
|
def on_display_info_click():
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# 调用ParkManage类中的方法来获取所有车辆信息
|
|
|
|
|
car_info= park.display_all_cars_info()
|
|
|
|
|
|
|
|
|
|
if car_info:
|
|
|
|
|
# 假设cars_info是一个包含车辆信息的列表,每个元素是车辆的字典表示
|
|
|
|
|
info_text = "\n".join(
|
|
|
|
|
[f"车牌号: {car['license_plate']}, 停放时间: {car['parked_time'].strftime('%Y-%m-%d %H:%M:%S')}"
|
|
|
|
|
f"{', 取车时间: ' + car['picked_up_time'].strftime('%Y-%m-%d %H:%M:%S') if car['picked_up_time'] else ''}"
|
|
|
|
|
for car in car_info])
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
messagebox.showerror("错误", f"显示车辆信息时发生错误: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_statistics_click():
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# 假设ParkManage类中包含以下统计方法
|
|
|
|
|
parked_cars_count = park_manage_instance.count_parked_cars()
|
|
|
|
|
empty_slots = park_manage_instance.count_empty_slots(total_slots=100) # 假设总车位数为100,根据实际情况调整
|
|
|
|
|
most_frequent_time = park_manage_instance.most_frequent_parking_time()
|
|
|
|
|
|
|
|
|
|
# 构建统计信息字符串
|
|
|
|
|
stats_message = (
|
|
|
|
|
f"当前停车数量: {parked_cars_count}\n"
|
|
|
|
|
f"空闲车位数: {empty_slots}\n"
|
|
|
|
|
f"最频繁的停车时段: {most_frequent_time}\n"
|
|
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
messagebox.showinfo("统计信息", stats_message)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
messagebox.showerror("错误", f"统计车辆信息时发生错误: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_switch_mode():
|
|
|
|
|
"""处理模式切换的回调函数"""
|
|
|
|
|
global isAdmin
|
|
|
|
|
isAdmin = not isAdmin
|
|
|
|
|
refresh_ui()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_exit_click():
|
|
|
|
|
"""处理退出操作的回调函数"""
|
|
|
|
|
if messagebox.askyesno("退出", "确定要退出吗?"):
|
|
|
|
|
window.destroy() # 关闭窗口
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def refresh_ui():
|
|
|
|
|
# 在此函数中移除与编辑车辆信息按钮相关的代码
|
|
|
|
|
for widget in window.winfo_children():
|
|
|
|
|
widget.destroy()
|
|
|
|
|
|
|
|
|
|
tk.Label(window, text=f"欢迎使用停车场管理系统 - {'管理员' if isAdmin else '用户'}模式").pack()
|
|
|
|
|
|
|
|
|
|
buttons = [
|
|
|
|
|
("停车", on_park_click),
|
|
|
|
|
("取车", on_pickup_click),
|
|
|
|
|
("查询车辆信息", on_inquire_click),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
if isAdmin:
|
|
|
|
|
# 从这里移除了与编辑车辆信息相关的按钮
|
|
|
|
|
additional_buttons = [
|
|
|
|
|
("显示车辆信息", on_display_info_click),
|
|
|
|
|
("统计信息", on_statistics_click),
|
|
|
|
|
("切换至用户模式", on_switch_mode),
|
|
|
|
|
]
|
|
|
|
|
buttons.extend(additional_buttons)
|
|
|
|
|
else:
|
|
|
|
|
buttons.append(("切换至管理员模式", on_switch_mode))
|
|
|
|
|
|
|
|
|
|
buttons.append(("退出", on_exit_click))
|
|
|
|
|
|
|
|
|
|
for idx, (text, cmd) in enumerate(buttons):
|
|
|
|
|
tk.Button(window, text=text, command=cmd).pack(fill=tk.X, pady=5)
|
|
|
|
|
|
|
|
|
|
def main_gui():
|
|
|
|
|
global window
|
|
|
|
|
window = tk.Tk()
|
|
|
|
|
window.title("停车场管理系统")
|
|
|
|
|
|
|
|
|
|
refresh_ui() # 初始化界面
|
|
|
|
|
window.mainloop()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main_gui()
|