186 lines
6.0 KiB
Python
186 lines
6.0 KiB
Python
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() |