|
|
楼主 |
发表于 2026-4-19 10:07:22
|
显示全部楼层
import tkinter as tkfrom tkinter import ttk, messageboximport timeimport random# 主窗口设置root = tk.Tk()root.title("🇨🇳 红军二万五千里长征模拟器")root.geometry("900x600")root.resizable(False, False)root.configure(bg="#f0f5ff")# 长征关键节点(按时间顺序)long_march_nodes = [ "瑞金出发", "突破湘江", "四渡赤水", "巧渡金沙江", "强渡大渡河", "飞夺泸定桥", "翻越夹金山", "懋功会师", "过草地", "吴起镇会师", "会宁会师"]# 节点坐标(对应画布位置)node_positions = [(50, 500), (150, 480), (250, 420), (350, 380), (450, 350), (550, 320), (650, 280), (700, 250), (750, 300), (800, 350), (850, 400)]# 画布(地图区域)canvas = tk.Canvas(root, width=900, height=500, bg="#e6f2ff")canvas.pack(pady=10)# 绘制长征路线(灰色虚线)for i in range(len(node_positions)-1): x1, y1 = node_positions x2, y2 = node_positions[i+1] canvas.create_line(x1, y1, x2, y2, fill="#666666", dash=(5, 5), width=2)# 绘制关键节点(圆形标记+文字)node_tags = []for i, (name, (x, y)) in enumerate(zip(long_march_nodes, node_positions)): # 节点圆 node = canvas.create_oval(x-15, y-15, x+15, y+15, fill="#c0392b", outline="white", width=2) node_tags.append(node) # 节点文字 canvas.create_text(x, y-25, text=name, font=("宋体", 9, "bold"), fill="#2c3e50")# 红军队伍(用小红点表示,初始在瑞金)army = []for _ in range(15): x = node_positions[0][0] + random.randint(-10, 10) y = node_positions[0][1] + random.randint(-10, 10) dot = canvas.create_oval(x-2, y-2, x+2, y+2, fill="#e74c3c", tag="army") army.append(dot)# 国旗元素(初始隐藏)flag = Noneflag_pole = Nonecurrent_node_index = 0 # 当前行进到的节点索引march_state = "ready" # ready: 准备, marching: 行军中, finished: 会师完成, flag: 升国旗# 状态标签status_label = ttk.Label(root, text="准备开始红军二万五千里长征模拟", font=("黑体", 12))status_label.pack(pady=5)# 行军动画函数def march_army(): global current_node_index, march_state if march_state != "ready": return march_state = "marching" status_label.config(text=f"正在行军:{long_march_nodes[0]} → {long_march_nodes[1]}") while current_node_index < len(long_march_nodes)-1: # 目标节点坐标 target_x, target_y = node_positions[current_node_index+1] # 移动红军队伍 for dot in army: dx = (target_x - canvas.coords(dot)[0]) / 50 dy = (target_y - canvas.coords(dot)[1]) / 50 for _ in range(50): canvas.move(dot, dx, dy) root.update() time.sleep(0.01) # 点亮当前节点 canvas.itemconfig(node_tags[current_node_index+1], fill="#27ae60") current_node_index += 1 # 更新状态 if current_node_index < len(long_march_nodes)-1: status_label.config(text=f"成功抵达:{long_march_nodes[current_node_index]} → 下一站:{long_march_nodes[current_node_index+1]}") else: status_label.config(text=f"🎉 成功抵达:{long_march_nodes[current_node_index]},长征胜利会师!") root.update() time.sleep(1) march_state = "finished" time.sleep(2) raise_flag() # 会师完成后升国旗# 升国旗函数def raise_flag(): global flag, flag_pole, march_state march_state = "flag" status_label.config(text="🇨🇳 升起五星红旗,致敬长征英雄!") # 清空画布多余元素,突出国旗 canvas.delete("army") for i in range(len(node_tags)): canvas.itemconfig(node_tags, fill="#95a5a6") # 绘制旗杆 flag_pole = canvas.create_line(450, 450, 450, 100, fill="#7f8c8d", width=5) # 绘制国旗(红色旗面+黄色五角星) flag_width = 120 flag_height = 80 flag_y_start = 450 - flag_height # 红旗面 flag = canvas.create_rectangle( 450, flag_y_start, 450 + flag_width, flag_y_start + flag_height, fill="#e74c3c", outline="white", width=1 ) # 大五角星 canvas.create_text(470, flag_y_start + 20, text="★", fill="yellow", font=("Arial", 20, "bold")) # 小五角星 small_stars_pos = [(520, 120), (530, 150), (520, 180), (500, 160)] for x, y in small_stars_pos: canvas.create_text(x, y, text="★", fill="yellow", font=("Arial", 10, "bold")) # 升旗动画 for _ in range(175): canvas.move(flag, 0, -2) for x, y in small_stars_pos: star = canvas.create_text(x, y - _*2, text="★", fill="yellow", font=("Arial", 10 if x!=470 else 20, "bold")) root.update() time.sleep(0.02) status_label.config(text="🎖️ 长征精神永垂不朽!五星红旗永远飘扬!") messagebox.showinfo("模拟完成", "红军二万五千里长征模拟成功!\n铭记历史,致敬先烈!")# 重置模拟函数def reset_simulation(): global current_node_index, march_state, army current_node_index = 0 march_state = "ready" status_label.config(text="准备开始红军二万五千里长征模拟") # 清空画布 canvas.delete("all") # 重新绘制路线和节点 for i in range(len(node_positions)-1): x1, y1 = node_positions x2, y2 = node_positions[i+1] canvas.create_line(x1, y1, x2, y2, fill="#666666", dash=(5, 5), width=2) node_tags.clear() for i, (name, (x, y)) in enumerate(zip(long_march_nodes, node_positions)): node = canvas.create_oval(x-15, y-15, x+15, y+15, fill="#c0392b", outline="white", width=2) node_tags.append(node) canvas.create_text(x, y-25, text=name, font=("宋体", 9, "bold"), fill="#2c3e50") # 重新生成红军队伍 army = [] for _ in range(15): x = node_positions[0][0] + random.randint(-10, 10) y = node_positions[0][1] + random.randint(-10, 10) dot = canvas.create_oval(x-2, y-2, x+2, y+2, fill="#e74c3c", tag="army") army.append(dot)# 按钮区域btn_frame = ttk.Frame(root)btn_frame.pack(pady=5)start_btn = ttk.Button(btn_frame, text="🚩 开始长征模拟", command=march_army)start_btn.pack(side="left", padx=10)reset_btn = ttk.Button(btn_frame, text="🔄 重置模拟", command=reset_simulation)reset_btn.pack(side="left", padx=10)# 启动主循环root.mainloop()
|
|