import tkinter as tk
import random
import math

class LotteryWheel:
    def __init__(self, window):
        # 主窗口基础设置
        self.win = window
        self.win.title("幸运大转盘抽奖")
        self.win.geometry("600x700")
        self.win.resizable(False, False)
        self.win.configure(bg="#f5f5f5")

        # 转盘基础参数
        self.center_x = 300    # 转盘圆心X
        self.center_y = 300    # 转盘圆心Y
        self.radius = 240      # 转盘半径
        # 抽奖奖项（可自由增删修改）
        self.prizes = [
            "手机一部",
            "蓝牙耳机",
            "充电宝",
            "精美水杯",
            "优惠券50元",
            "谢谢参与",
            "零食大礼包",
            "玩偶公仔"
        ]
        # 每一格对应颜色
        self.colors = [
            "#e74c3c", "#f39c12", "#f1c40f", "#2ecc71",
            "#1abc9c", "#3498db", "#9b59b6", "#e67e22"
        ]
        self.part_num = len(self.prizes)
        self.each_degree = 360 / self.part_num  # 每一份扇形角度

        # 旋转变量
        self.rotate_total = 0   # 累计旋转总角度
        self.is_running = False # 是否正在转动
        self.speed = 0          # 旋转速度

        # 画布：绘制转盘
        self.canvas = tk.Canvas(
            self.win, width=580, height=580, bg="white", highlightthickness=0
        )
        self.canvas.pack(pady=15)

        # 底部结果+按钮区域
        bottom_frame = tk.Frame(self.win, bg="#f5f5f5")
        bottom_frame.pack()

        # 中奖结果文本
        self.result_text = tk.StringVar(value="点击开始抽奖")
        tk.Label(
            bottom_frame, textvariable=self.result_text,
            font=("微软雅黑", 16, "bold"), fg="#c0392b", bg="#f5f5f5"
        ).grid(row=0, column=0, columnspan=2, pady=10)

        # 开始按钮
        self.btn_start = tk.Button(
            bottom_frame, text="开始抽奖", width=12, height=2,
            font=("微软雅黑", 12), bg="#27ae60", fg="white",
            command=self.start_rotate
        )
        self.btn_start.grid(row=1, column=0, padx=12)

        # 停止按钮
        self.btn_stop = tk.Button(
            bottom_frame, text="停止抽奖", width=12, height=2,
            font=("微软雅黑", 12), bg="#e74c3c", fg="white",
            command=self.stop_rotate, state=tk.DISABLED
        )
        self.btn_stop.grid(row=1, column=1, padx=12)

        # 初始绘制转盘和指针
        self.draw_wheel()
        self.draw_pointer()

    # 绘制整个转盘所有扇形分区
    def draw_wheel(self):
        self.canvas.delete("wheel")
        for i in range(self.part_num):
            # 扇形起始、结束角度
            start_angle = self.rotate_total + i * self.each_degree
            end_angle = start_angle + self.each_degree

            # 绘制扇形区块
            self.canvas.create_arc(
                self.center_x - self.radius, self.center_y - self.radius,
                self.center_x + self.radius, self.center_y + self.radius,
                start=start_angle, extent=self.each_degree,
                fill=self.colors[i], outline="white", width=3, tags="wheel"
            )

            # 计算文字摆放位置
            mid_angle = math.radians(start_angle + self.each_degree / 2)
            text_r = self.radius * 0.68
            text_x = self.center_x + text_r * math.cos(mid_angle)
            text_y = self.center_y - text_r * math.sin(mid_angle)

            # 写入奖项文字
            self.canvas.create_text(
                text_x, text_y, text=self.prizes[i],
                font=("微软雅黑", 10, "bold"), fill="white", tags="wheel"
            )
        # 转盘外圈黑边
        self.canvas.create_oval(
            self.center_x - self.radius - 6, self.center_y - self.radius - 6,
            self.center_x + self.radius + 6, self.center_y + self.radius + 6,
            outline="#222222", width=5, tags="wheel"
        )

    # 绘制顶部红色指针
    def draw_pointer(self):
        self.canvas.delete("pointer")
        # 三角形指针坐标
        p1 = (self.center_x, self.center_y - self.radius + 15)
        p2 = (self.center_x - 22, self.center_y - self.radius - 30)
        p3 = (self.center_x + 22, self.center_y - self.radius - 30)
        self.canvas.create_polygon(p1, p2, p3, fill="red", tags="pointer")
        # 中心圆点
        self.canvas.create_oval(
            self.center_x-15, self.center_y-15,
            self.center_x+15, self.center_y+15,
            fill="#333333", tags="pointer"
        )

    # 开启旋转
    def start_rotate(self):
        if self.is_running:
            return
        self.is_running = True
        self.btn_start.config(state=tk.DISABLED)
        self.btn_stop.config(state=tk.NORMAL)
        self.result_text.set("转盘旋转中...")
        self.speed = random.randint(14, 20)
        # 随机总旋转圈数：多转几圈再慢慢停下
        self.target_total = self.rotate_total + random.randint(1200, 2800)
        self.animation_loop()

    # 动画循环：持续刷新转盘角度
    def animation_loop(self):
        if not self.is_running:
            return
        self.rotate_total += self.speed
        self.draw_wheel()

        # 到达目标角度，开始减速
        if self.rotate_total >= self.target_total:
            self.speed *= 0.95
            # 速度足够慢，停止旋转，计算中奖
            if self.speed < 0.25:
                self.is_running = False
                self.calculate_award()
                self.btn_start.config(state=tk.NORMAL)
                self.btn_stop.config(state=tk.DISABLED)
                return
        # 每隔15毫秒刷新画面
        self.win.after(15, self.animation_loop)

    # 手动提前停止转盘
    def stop_rotate(self):
        if not self.is_running:
            return
        self.target_total = self.rotate_total + random.randint(200, 600)
        self.speed = 8

    # 根据停下的角度，计算抽到的奖品
    def calculate_award(self):
        # 取余数，换算0~360度
        remain_angle = (360 - (self.rotate_total % 360)) % 360
        index = int(remain_angle // self.each_degree)
        award = self.prizes[index]
        self.result_text.set(f"🎉 恭喜您中奖：{award}")

# 程序入口
if __name__ == "__main__":
    root = tk.Tk()
    app = LotteryWheel(root)
    root.mainloop()