import tkinter as tk
import random
import math

# 窗口主程序
class LuckyWheel:
    def __init__(self, root):
        self.root = root
        self.root.title("转盘抽奖系统")
        self.root.geometry("550x650")
        self.root.resizable(False, False)

        # 转盘参数设置
        self.wheel_r = 200  # 转盘半径
        self.center_x = 270
        self.center_y = 270
        # 抽奖奖项配置（可自行修改奖项和对应概率）
        self.prize_list = [
            ("一等奖 手机", 5),
            ("二等奖 耳机", 10),
            ("三等奖 充电宝", 15),
            ("四等奖 水杯", 20),
            ("谢谢参与", 30),
            ("优惠券一张", 20)
        ]
        self.color_list = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#FFA07A", "#98D8C8", "#F7DC6F"]
        self.section_num = len(self.prize_list)
        self.each_angle = 360 / self.section_num

        # 转盘旋转相关变量
        self.total_rotate = 0  # 累计旋转角度
        self.is_spinning = False
        self.speed = 0
        self.target_angle = 0

        # 绘制画布
        self.canvas = tk.Canvas(root, width=540, height=540, bg="white")
        self.canvas.pack(pady=10)
        self.draw_wheel()
        self.draw_pointer()

        # 底部控件区域
        frame_bottom = tk.Frame(root)
        frame_bottom.pack(pady=5)

        self.result_var = tk.StringVar(value="等待抽奖...")
        tk.Label(frame_bottom, textvariable=self.result_var, font=("微软雅黑", 14, "bold"), fg="red").grid(row=0, column=0, columnspan=2, pady=8)

        self.btn_start = tk.Button(frame_bottom, text="开始抽奖", width=12, height=2, font=("微软雅黑",12), bg="#28a745", fg="white", command=self.start_spin)
        self.btn_start.grid(row=1, column=0, padx=10)

        self.btn_stop = tk.Button(frame_bottom, text="停止抽奖", width=12, height=2, font=("微软雅黑",12), bg="#dc3545", fg="white", command=self.stop_spin, state="disabled")
        self.btn_stop.grid(row=1, column=1, padx=10)

    # 绘制转盘扇形区块
    def draw_wheel(self):
        self.canvas.delete("wheel")
        for index in range(self.section_num):
            start = self.total_rotate + index * self.each_angle
            end = start + self.each_angle
            # 绘制扇形
            self.canvas.create_arc(
                self.center_x - self.wheel_r, self.center_y - self.wheel_r,
                self.center_x + self.wheel_r, self.center_y + self.wheel_r,
                start=start, extent=self.each_angle, fill=self.color_list[index], tags="wheel", outline="white", width=2
            )
            # 计算文字位置
            mid_angle = math.radians(start + self.each_angle / 2)
            text_r = self.wheel_r * 0.65
            tx = self.center_x + text_r * math.cos(mid_angle)
            ty = self.center_y - text_r * math.sin(mid_angle)
            self.canvas.create_text(tx, ty, text=self.prize_list[index][0], font=("微软雅黑",9,"bold"), fill="white", tags="wheel")
        # 外圈边框
        self.canvas.create_oval(
            self.center_x - self.wheel_r - 5, self.center_y - self.wheel_r -5,
            self.center_x + self.wheel_r +5, self.center_y + self.wheel_r +5,
            outline="#333333", width=4, tags="wheel"
        )

    # 绘制中奖指针
    def draw_pointer(self):
        self.canvas.delete("pointer")
        p_x1, p_y1 = self.center_x, self.center_y - self.wheel_r + 10
        p_x2, p_y2 = self.center_x - 18, self.center_y - self.wheel_r - 25
        p_x3, p_y3 = self.center_x + 18, self.center_y - self.wheel_r - 25
        self.canvas.create_polygon(p_x1,p_y1, p_x2,p_y2, p_x3,p_y3, fill="#ff3333", tags="pointer")
        self.canvas.create_oval(self.center_x-12, self.center_y-12, self.center_x+12, self.center_y+12, fill="#222222", tags="pointer")

    # 开始旋转
    def start_spin(self):
        if self.is_spinning:
            return
        self.is_spinning = True
        self.btn_start.config(state="disabled")
        self.btn_stop.config(state="normal")
        self.result_var.set("抽奖进行中...")
        self.speed = random.randint(12, 18)
        # 随机目标停止角度（多转几圈再停下）
        self.target_angle = self.total_rotate + random.randint(1080, 2520)
        self.animate_wheel()

    # 转盘动画循环
    def animate_wheel(self):
        if not self.is_spinning:
            return
        self.total_rotate += self.speed
        self.draw_wheel()
        # 逐渐减速
        if self.total_rotate >= self.target_angle:
            self.speed *= 0.96
            if self.speed < 0.3:
                self.is_spinning = False
                self.calc_prize()
                self.btn_start.config(state="normal")
                self.btn_stop.config(state="disabled")
                return
        self.root.after(15, self.animate_wheel)

    # 手动立刻停止
    def stop_spin(self):
        if not self.is_spinning:
            return
        self.target_angle = self.total_rotate + random.randint(180, 720)
        self.speed = 6

    # 根据指针位置计算中奖奖项
    def calc_prize(self):
        fix_angle = (360 - (self.total_rotate % 360)) % 360
        prize_index = int(fix_angle // self.each_angle)
        prize_name = self.prize_list[prize_index][0]
        self.result_var.set(f"🎉 恭喜中奖：{prize_name}")

if __name__ == "__main__":
    main_window = tk.Tk()
    app = LuckyWheel(main_window)
    main_window.mainloop()