import tkinter as tk import random import math import time class RouletteApp: def __init__(self, root): self.root = root self.root.title("大转盘点名系统") self.root.geometry("600x650") # 学生名单 self.students = [ "张三", "李四", "王五", "赵六" ] # 颜色列表 self.colors = [ "#FF9999", "#99FF99", "#9999FF", "#FF99FF" ] # 创建画布 self.canvas = tk.Canvas(root, width=500, height=500, bg="white") self.canvas.pack(pady=20) # 创建按钮 self.spin_button = tk.Button(root, text="开始旋转", command=self.start_spin, font=("Arial", 14), bg="#4CAF50", fg="white") self.spin_button.pack(pady=10) # 创建结果显示标签 self.result_label = tk.Label(root, text="等待旋转...", font=("Arial", 16, "bold"), fg="#333333") self.result_label.pack(pady=10) # 绘制初始转盘 self.draw_roulette() # 旋转状态变量 self.is_spinning = False self.spin_speed = 0 self.selected_student = "" def draw_roulette(self): """绘制转盘""" self.canvas.delete("all") # 清除画布 # 计算每个扇区的角度 angle_per_sector = 360 / len(self.students) # 绘制扇区 for i in range(len(self.students)): start_angle = i * angle_per_sector self.canvas.create_arc( 50, 50, 450, 450, start=start_angle, extent=angle_per_sector, fill=self.colors[i % len(self.colors)], outline="black" ) # 添加学生姓名 angle_rad = math.radians(start_angle + angle_per_sector / 2) text_x = 250 + 150 * math.cos(angle_rad) text_y = 250 + 150 * math.sin(angle_rad) self.canvas.create_text( text_x, text_y, text=self.students[i], font=("Arial", 10, "bold"), angle=start_angle + angle_per_sector / 2 ) # 绘制中心圆 self.canvas.create_oval(240, 240, 260, 260, fill="#FFFFFF", outline="black") # 绘制指针 self.canvas.create_line(250, 50, 250, 20, width=3, arrow=tk.LAST, fill="red") self.canvas.create_polygon(240, 50, 260, 50, 250, 70, fill="red") def start_spin(self): """开始旋转转盘""" if not self.is_spinning: self.is_spinning = True self.spin_button.config(state=tk.DISABLED) self.result_label.config(text="旋转中...") self.spin_speed = random.uniform(30, 50) # 初始旋转速度 self.spin_roulette() def spin_roulette(self): """旋转转盘动画""" if self.spin_speed > 0.1: # 旋转转盘 self.canvas.delete("all") self.draw_rotated_roulette(self.spin_speed) # 更新旋转速度(减慢) self.spin_speed *= 0.97 # 继续旋转 self.root.after(30, self.spin_roulette) else: # 旋转结束 self.is_spinning = False self.spin_button.config(state=tk.NORMAL) self.select_winner() def draw_rotated_roulette(self, rotation): """绘制旋转后的转盘""" # 计算每个扇区的角度 angle_per_sector = 360 / len(self.students) # 绘制扇区 for i in range(len(self.students)): start_angle = i * angle_per_sector + rotation self.canvas.create_arc( 50, 50, 450, 450, start=start_angle, extent=angle_per_sector, fill=self.colors[i % len(self.colors)], outline="black" ) # 添加学生姓名 angle_rad = math.radians(start_angle + angle_per_sector / 2) text_x = 250 + 150 * math.cos(angle_rad) text_y = 250 + 150 * math.sin(angle_rad) self.canvas.create_text( text_x, text_y, text=self.students[i], font=("Arial", 10, "bold"), angle=start_angle + angle_per_sector / 2 ) # 绘制中心圆 self.canvas.create_oval(240, 240, 260, 260, fill="#FFFFFF", outline="black") # 绘制指针 self.canvas.create_line(250, 50, 250, 20, width=3, arrow=tk.LAST, fill="red") self.canvas.create_polygon(240, 50, 260, 50, 250, 70, fill="red") def select_winner(self): """随机选择一名学生并显示结果""" self.selected_student = random.choice(self.students) self.result_label.config(text=f"恭喜!被选中的是: {self.selected_student}", fg="#E91E63") # 高亮显示选中的学生 self.highlight_winner() def highlight_winner(self): """高亮显示被选中的学生""" self.draw_roulette() # 先绘制正常转盘 # 找到选中学生的索引 winner_idx = self.students.index(self.selected_student) angle_per_sector = 360 / len(self.students) # 绘制高亮扇区 start_angle = winner_idx * angle_per_sector self.canvas.create_arc( 50, 50, 450, 450, start=start_angle, extent=angle_per_sector, fill="#FFEB3B", # 黄色高亮 outline="black", width=2 ) # 重新添加学生姓名 angle_rad = math.radians(start_angle + angle_per_sector / 2) text_x = 250 + 150 * math.cos(angle_rad) text_y = 250 + 150 * math.sin(angle_rad) self.canvas.create_text( text_x, text_y, text=self.selected_student, font=("Arial", 10, "bold"), fill="red", # 红色文本 angle=start_angle + angle_per_sector / 2 ) if __name__ == "__main__": root = tk.Tk() app = RouletteApp(root) root.mainloop()