import tkinter as tk
import math
import random

class SpinWheel:
    def __init__(self, root):
        self.root = root
        self.root.title("转盘抽奖")
        self.root.geometry("500x600")
        self.root.resizable(False, False)

        # 奖项设置（按顺时针顺序）
        self.prizes = ["一等奖", "二等奖", "三等奖", "四等奖", "五等奖", "谢谢参与"]
        # 对应颜色（足够鲜艳）
        self.colors = ["#FF6B6B", "#4ECDC4", "#FFE66D", "#95E1D3", "#F38181", "#AA96DA"]

        self.num = len(self.prizes)
        self.angle_per = 360.0 / self.num   # 每个扇区角度

        # 转盘参数
        self.center_x = 250
        self.center_y = 250
        self.radius = 200

        # 偏移量（起始角度偏移，用于旋转动画）
        self.offset = 0
        # 动画状态
        self.is_spinning = False
        self.target_offset = 0
        self.step = 0

        # 创建画布
        self.canvas = tk.Canvas(root, width=500, height=500, bg="#F0F0F0")
        self.canvas.pack(pady=10)

        # 结果显示标签
        self.result_label = tk.Label(root, text="点击下方按钮开始抽奖", font=("Arial", 14), fg="#333")
        self.result_label.pack(pady=10)

        # 抽奖按钮
        self.spin_btn = tk.Button(root, text="抽奖", font=("Arial", 16), bg="#4CAF50", fg="white",
                                  width=10, height=1, command=self.start_spin)
        self.spin_btn.pack(pady=10)

        # 绘制初始转盘（偏移量为0）
        self.draw_wheel(self.offset)

    def draw_wheel(self, offset):
        """根据偏移量绘制整个转盘（含指针）"""
        self.canvas.delete("all")
        cx, cy = self.center_x, self.center_y
        r = self.radius

        # 绘制每个扇区
        for i in range(self.num):
            start_angle = offset + i * self.angle_per
            # 绘制扇形（extent为正表示逆时针，但在屏幕上看起来顺时针）
            self.canvas.create_arc(
                cx - r, cy - r, cx + r, cy + r,
                start=start_angle, extent=self.angle_per,
                fill=self.colors[i], outline="white", width=2,
                style=tk.PIESLICE
            )
            # 计算扇区中心角度（弧度）
            mid_angle = math.radians(start_angle + self.angle_per / 2)
            # 文字放置在半径一半的位置
            text_r = r * 0.65
            tx = cx + text_r * math.cos(mid_angle)
            ty = cy - text_r * math.sin(mid_angle)   # 因为屏幕y轴向下
            # 根据扇区角度旋转文字方向（可省略）
            self.canvas.create_text(
                tx, ty,
                text=self.prizes[i],
                font=("Arial", 12, "bold"),
                fill="#333"
            )

        # 绘制指针（固定在顶部，指向12点钟方向）
        # 指针：一个三角形，尖端在中心正上方，底部在中心附近
        pointer_len = 30
        base_len = 15
        # 尖端坐标 (cx, cy - r + 5)
        tip_x, tip_y = cx, cy - r + 5
        # 底部两点
        base_x1, base_y1 = cx - base_len, cy - r + 5 + pointer_len
        base_x2, base_y2 = cx + base_len, cy - r + 5 + pointer_len
        self.canvas.create_polygon(
            tip_x, tip_y, base_x1, base_y1, base_x2, base_y2,
            fill="red", outline="black", width=2
        )
        # 中心小圆装饰
        self.canvas.create_oval(cx-8, cy-8, cx+8, cy+8, fill="gold", outline="black")

    def start_spin(self):
        """开始抽奖"""
        if self.is_spinning:
            return
        self.is_spinning = True
        self.spin_btn.config(state=tk.DISABLED)
        self.result_label.config(text="抽奖中...", fg="blue")

        # 随机生成目标偏移：至少转5~10圈，再随机停在某个角度
        extra_rotations = random.randint(5, 10) * 360
        random_angle = random.uniform(0, 360)
        self.target_offset = self.offset + extra_rotations + random_angle
        self.step = 10  # 每次增加10度

        # 开始动画
        self.animate()

    def animate(self):
        """逐帧动画"""
        if self.offset < self.target_offset:
            # 逐渐增加偏移量
            self.offset += self.step
            # 如果超出目标则修正
            if self.offset > self.target_offset:
                self.offset = self.target_offset
            self.draw_wheel(self.offset)
            # 速度可动态变化（这里简单线性）
            delay = 20  # 毫秒
            self.root.after(delay, self.animate)
        else:
            # 动画结束，计算中奖结果
            self.is_spinning = False
            self.spin_btn.config(state=tk.NORMAL)
            self.show_result()

    def show_result(self):
        """根据最终偏移计算指针指向的奖项"""
        # 指针固定在顶部（12点钟方向），在数学角度中对应 -90°（或 270°）
        pointer_angle = -90   # 因为绘制时从-90度开始偏移，我们统一用度数
        # 但我们的offset是相对于起始角度0的偏移，指针在-90度固定。
        # 计算指针相对于当前偏移的有效角度（0~360）
        # 指针实际角度 = pointer_angle - offset （因为offset增加了起始角度，相当于转盘旋转）
        # 但我们需要计算指针在转盘坐标系中的位置。
        # 转盘的每个扇区起始角度为 offset + i*angle_per，结束为 offset + (i+1)*angle_per
        # 指针固定角度为 pointer_angle（-90），我们需要看它落在哪个区间。
        # 将指针角度归一化到 [0,360)
        p_angle = pointer_angle % 360
        # 计算相对偏移的角度
        rel_angle = (p_angle - self.offset) % 360
        # 计算所在扇区索引
        idx = int(rel_angle // self.angle_per)
        # 防止边界情况（浮点误差）
        if idx >= self.num:
            idx = self.num - 1
        prize = self.prizes[idx]
        self.result_label.config(text=f"🎉 恭喜获得：{prize} 🎉", fg="red")

if __name__ == "__main__":
    root = tk.Tk()
    app = SpinWheel(root)
    root.mainloop()