import json
import tkinter as tk
from tkinter import messagebox
class CampusMap:
def __init__(self):
self.users = {} # 保存用户账号信息
self.current_user = None # 当前登录的用户
self.load_users_from_file() # 从文件加载用户信息
self.vertices = {} # 保存地点信息的字典
self.edges = {} # 保存路径信息的字典
self.load_map_from_file() # 从文件加载地图信息
self.root = tk.Tk() # 创建主窗口
def load_users_from_file(self):
try:
# 从文件加载用户信息
with open("users.json", "r") as file:
self.users = json.load(file)
except FileNotFoundError:
pass
def save_users_to_file(self):
# 将用户信息保存到文件
with open("users.json", "w") as file:
json.dump(self.users, file)
def save_map_to_file(self):
# 将地图信息保存到文件
with open("campus_map.json", "w") as file:
map_data = {"vertices": self.vertices, "edges": self.edges}
json.dump(map_data, file)
def load_map_from_file(self):
try:
# 从文件加载地图信息
with open("campus_map.json", "r") as file:
map_data = json.load(file)
self.vertices = map_data.get("vertices", {})
self.edges = map_data.get("edges", {})
except FileNotFoundError:
pass
def login(self, username, password):
# 用户登录
if username in self.users and self.users[username]["password"] == password:
self.current_user = username
print(f"用户 {username} 登录成功!")
else:
print("错误:用户名或密码不正确。")
def logout(self):
# 用户登出
self.current_user = None
print("用户已登出。")
def register(self, username, password, user_type):
# 用户注册
if username not in self.users:
self.users[username] = {"password": password, "type": user_type}
self.save_users_to_file()
print(f"用户 {username} 注册成功!")
else:
print("错误:用户名已存在。")
def register_ui(self):
# 注册界面
register_window = tk.Toplevel(self.root)
register_window.title("注册")
tk.Label(register_window, text="用户名:").grid(row=0, column=0, padx=10, pady=10)
tk.Label(register_window, text="密码:").grid(row=1, column=0, padx=10, pady=10)
tk.Label(register_window, text="用户类型(管理员/用户):").grid(row=2, column=0, padx=10, pady=10)
username_var = tk.StringVar()
password_var = tk.StringVar()
user_type_var = tk.StringVar()
tk.Entry(register_window, textvariable=username_var).grid(row=0, column=1, padx=10, pady=10)
tk.Entry(register_window, textvariable=password_var, show="*").grid(row=1, column=1, padx=10, pady=10)
tk.Entry(register_window, textvariable=user_type_var).grid(row=2, column=1, padx=10, pady=10)
def register():
username = username_var.get()
password = password_var.get()
user_type = user_type_var.get()
if username and password and user_type:
self.register(username, password, user_type)
register_window.destroy()
else:
messagebox.showerror("错误", "所有字段都必须填写")
tk.Button(register_window, text="注册", command=register).grid(row=3, column=0, columnspan=2, pady=10)
def login_ui(self):
# 登录界面
login_window = tk.Toplevel(self.root)
login_window.title("登录")
tk.Label(login_window, text="用户名:").grid(row=0, column=0, padx=10, pady=10)
tk.Label(login_window, text="密码:").grid(row=1, column=0, padx=10, pady=10)
username_var = tk.StringVar()
password_var = tk.StringVar()
tk.Entry(login_window, textvariable=username_var).grid(row=0, column=1, padx=10, pady=10)
tk.Entry(login_window, textvariable=password_var, show="*").grid(row=1, column=1, padx=10, pady=10)
error_label = tk.Label(login_window, text="", fg="red")
error_label.grid(row=2, column=0, columnspan=2, pady=10)
def login():
username = username_var.get()
password = password_var.get()
if username and password:
self.login(username, password)
if self.current_user == username:
login_window.destroy()
self.user_menu_ui() # 登录成功后进入菜单窗口
else:
error_label.config(text="账号或密码错误")
else:
error_label.config(text="所有字段都必须填写")
tk.Button(login_window, text="登录", command=login).grid(row=3, column=0, columnspan=2, pady=10)
def shortest_path(self, start, end, visited=None, path=None):
# 实现最短路径查询算法(深度优先搜索)
if visited is None:
visited = set()
if path is None:
path = []
visited.add(start)
path = path + [start]
if start == end:
return path
shortest = None
for neighbor, _ in self.edges.get(start, []):
if neighbor not in visited:
new_path = self.shortest_path(neighbor, end, visited, path)
if new_path:
if not shortest or len(new_path) < len(shortest):
shortest = new_path
return shortest
def query_route(self, start, end):
# 实现路径查询算法
shortest_path = self.shortest_path(start, end)
all_paths = self.get_all_paths(start, end)
sorted_paths = sorted(all_paths, key=lambda path: self.calculate_path_weight(path))
if shortest_path:
print(f"最短简单路径: {shortest_path}")
else:
print("未找到最短简单路径")
if sorted_paths:
print("所有可通行路径按带权值排序:")
for path in sorted_paths:
weight = self.calculate_path_weight(path)
print(f"路径: {path}, 权值: {weight}")
else:
print("未找到可通行路径")
return shortest_path, sorted_paths
def get_all_paths(self, start, end, visited=None, path=None):
# 获取所有可通行的路径
if visited is None:
visited = set()
if path is None:
path = []
visited.add(start)
path = path + [start]
if start == end:
return [path]
all_paths = []
for neighbor, _ in self.edges.get(start, []):
if neighbor not in visited:
new_paths = self.get_all_paths(neighbor, end, visited.copy(), path.copy())
all_paths.extend(new_paths)
return all_paths
def calculate_path_weight(self, path):
# 计算路径的总权重
weight = 0
for i in range(len(path) - 1):
start, end = path[i], path[i + 1]
edges = self.edges.get(start, [])
for edge_end, edge_weight in edges:
if edge_end == end:
weight += int(edge_weight) if edge_weight is not None else 0
break
return weight
def get_all_paths_from_start(self, start):
# 获取所有从指定起点出发的路径
all_paths = []
for end in self.vertices:
if start != end:
paths = self.get_all_paths(start, end)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
campus_navigation.zip (3个子文件)
campus_map.json 2KB
main.py 20KB
users.json 221B
共 3 条
- 1
资源评论
汘荨
- 粉丝: 1082
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功