import tkinter as tk
from tkinter import messagebox, scrolledtext
import math
import random
import time

class LuckyWheel:
    def __init__(self, root):
        self.root = root
        self.root.title("权重概率转盘抽奖")
        self.root.geometry("700x620")
        self.root.resizable(False, False)

        self.rotate_angle = 0
        self.is_rolling = False
        self.record = []

        # 奖品(名称,颜色,权重)
        self.prize_list = [
            ("一等奖 手机", "#ff3b30", 1),
            ("二等奖 耳机", "#ff9500", 2),
            ("三等奖 充电宝", "#ffcc00", 4),
            ("四等奖 水杯", "#34c759", 8),
            ("谢谢参与", "#007aff", 30),
            ("优惠券5元", "#af52de", 12),
            ("零食礼包", "#ff2d55", 10),
            ("再来一次", "#5856d6", 15)
        ]
        self.weight_sum = sum(item[2] for item in self.prize_list)
        self.sector_info = []
        current_deg = 0
        for name, color, weight in self.prize_list:
            deg = (weight / self.weight_sum) * 360
            self.sector_info.append([name, color, current_deg, deg])
            current_deg += deg

        self.canvas = tk.Canvas(root, width=500, height=500, bg="white")
        self.canvas.place(x=100, y=10)
        self.center_x = 250
        self.center_y = 250
        self.radius = 220

        self.draw_wheel()
        self.draw_pointer()

        btn_frame = tk.Frame(root)
        btn_frame.place(x=120, y=520)
        self.start_btn = tk.Button(btn_frame, text="开始抽奖", font=("微软雅黑", 14), width=10, bg="#e53935", fg="white", command=self.roll_wheel)
        self.start_btn.grid(row=0, column=0, padx=10)
        self.reset_btn = tk.Button(btn_frame, text="重置转盘", font=("微软雅黑", 14), width=10, bg="#2196f3", fg="white", command=self.reset_wheel)
        self.reset_btn.grid(row=0, column=1, padx=10)
        self.record_btn = tk.Button(btn_frame, text="查看中奖记录", font=("微软雅黑", 14), width=12, bg="#43a047", fg="white", command=self.show_record)
        self.record_btn.grid(row=0, column=2, padx=10)

    def draw_wheel(self):
        self.canvas.delete("wheel")
        for name, color, start_deg, span_deg in self.sector_info:
            real_start = self.rotate_angle + start_deg - 90
            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=real_start, extent=span_deg, fill=color, outline="white", width=3, tags="wheel"
            )
            mid_real = math.radians(real_start + span_deg / 2)
            text_r = self.radius * 0.65
            tx = self.center_x + text_r * math.cos(mid_real)
            ty = self.center_y - text_r * math.sin(mid_real)
            self.canvas.create_text(tx, ty, text=name, font=("微软雅黑", 9, "bold"), fill="white", tags="wheel")

        self.canvas.create_oval(
            self.center_x - self.radius - 5, self.center_y - self.radius - 5,
            self.center_x + self.radius + 5, self.center_y + self.radius + 5,
            outline="#222222", width=4, tags="wheel"
        )

    # ========== 修改：指针放在转盘正下方，箭头朝下指向转盘边缘 ==========
    def draw_pointer(self):
        self.canvas.delete("pointer")
        bottom_x = self.center_x
        bottom_y = self.center_y + self.radius
        # 三角朝下，尖角贴住转盘底边
        p_points = [
            (bottom_x, bottom_y),
            (bottom_x - 22, bottom_y + 28),
            (bottom_x + 22, bottom_y + 28)
        ]
        self.canvas.create_polygon(p_points, fill="#d32f2f", outline="black", width=2, tags="pointer")
        # 中心圆点不变
        self.canvas.create_oval(
            self.center_x - 14, self.center_y - 14,
            self.center_x + 14, self.center_y + 14,
            fill="#222222", tags="pointer"
        )

    def roll_wheel(self):
        if self.is_rolling:
            return
        self.is_rolling = True
        self.start_btn.config(state="disabled")

        total_circle = random.randint(6, 10)
        target_extra = random.uniform(0, 360)
        total_rotate = total_circle * 360 + target_extra
        speed = 12
        current_rot = 0

        while current_rot < total_rotate:
            remain = total_rotate - current_rot
            if remain < 180:
                speed = max(0.3, speed * 0.96)
            self.rotate_angle += speed
            current_rot += speed
            self.draw_wheel()
            self.root.update()
            time.sleep(0.008)

        rot_mod = self.rotate_angle % 360
        hit_angle = (360 - rot_mod + 180) % 360
        win_name = "未知奖品"
        for name, _, s_start, s_len in self.sector_info:
            if s_start <= hit_angle < s_start + s_len:
                win_name = name
                break

        self.record.append(win_name)
        messagebox.showinfo("恭喜中奖！", f"您抽中：{win_name}")
        self.is_rolling = False
        self.start_btn.config(state="normal")

    def reset_wheel(self):
        if self.is_rolling:
            return
        self.rotate_angle = 0
        self.draw_wheel()

    def show_record(self):
        win = tk.Toplevel(self.root)
        win.title("中奖记录")
        win.geometry("400x300")
        text_area = scrolledtext.ScrolledText(win, font=("微软雅黑", 11))
        text_area.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        if not self.record:
            text_area.insert(tk.END, "暂无中奖记录")
        else:
            for idx, item in enumerate(self.record, 1):
                text_area.insert(tk.END, f"{idx}. {item}\n")
        text_area.config(state="disabled")

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