import tkinter as tk
from tkinter import ttk, messagebox
import time
import threading
import winsound  # 仅适用于 Windows，Mac/Linux 需替换为其他发声方式

class ModernTimerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("多功能定时器 & 秒表")
        self.root.geometry("500x450")
        self.root.resizable(False, False)
        
        # 变量初始化
        self.timer_running = False
        self.timer_paused = False
        self.remaining_seconds = 0
        self.original_seconds = 0
        
        self.stopwatch_running = False
        self.stopwatch_start_time = 0
        self.stopwatch_elapsed = 0
        self.stopwatch_job = None
        
        # 样式配置
        self.style = ttk.Style()
        self.style.theme_use('clam')
        # 自定义按钮样式
        self.style.configure('TButton', font=('Arial', 12), padding=10)
        self.style.configure('Start.TButton', background='#4CAF50', foreground='white')
        self.style.configure('Pause.TButton', background='#FF9800', foreground='white')
        self.style.configure('Reset.TButton', background='#F44336', foreground='white')

        self.setup_ui()

    def setup_ui(self):
        # 顶部标签页
        self.notebook = ttk.Notebook(self.root)
        self.notebook.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)

        # --- 倒计时页面 ---
        self.frame_timer = ttk.Frame(self.notebook, padding="20")
        self.notebook.add(self.frame_timer, text="⏳ 倒计时")
        
        # 输入区域
        input_frame = ttk.LabelFrame(self.frame_timer, text="设置时间", padding=15)
        input_frame.pack(fill=tk.X, pady=(0, 20))
        
        ttk.Label(input_frame, text="时:").pack(side=tk.LEFT, padx=5)
        self.entry_hours = ttk.Spinbox(input_frame, from_=0, to=23, width=5, font=("Arial", 14))
        self.entry_hours.pack(side=tk.LEFT, padx=5)
        self.entry_hours.set(0)
        
        ttk.Label(input_frame, text="分:").pack(side=tk.LEFT, padx=5)
        self.entry_minutes = ttk.Spinbox(input_frame, from_=0, to=59, width=5, font=("Arial", 14))
        self.entry_minutes.pack(side=tk.LEFT, padx=5)
        self.entry_minutes.set(5)
        
        ttk.Label(input_frame, text="秒:").pack(side=tk.LEFT, padx=5)
        self.entry_seconds = ttk.Spinbox(input_frame, from_=0, to=59, width=5, font=("Arial", 14))
        self.entry_seconds.pack(side=tk.LEFT, padx=5)
        self.entry_seconds.set(0)

        # 显示区域 (大数字)
        self.lbl_timer_display = tk.Label(
            self.frame_timer, 
            text="00:05:00", 
            font=("Consolas", 60, "bold"), 
            fg="#333333",
            bg="#f0f0f0",
            relief=tk.SUNKEN,
            bd=2
        )
        self.lbl_timer_display.pack(fill=tk.X, pady=20)

        # 控制按钮
        btn_frame_timer = ttk.Frame(self.frame_timer)
        btn_frame_timer.pack()
        
        self.btn_timer_start = ttk.Button(btn_frame_timer, text="开始", command=self.start_timer, style='Start.TButton')
        self.btn_timer_start.pack(side=tk.LEFT, padx=10)
        
        self.btn_timer_pause = ttk.Button(btn_frame_timer, text="暂停", command=self.pause_timer, style='Pause.TButton')
        self.btn_timer_pause.pack(side=tk.LEFT, padx=10)
        self.btn_timer_pause.config(state=tk.DISABLED)
        
        self.btn_timer_reset = ttk.Button(btn_frame_timer, text="重置", command=self.reset_timer, style='Reset.TButton')
        self.btn_timer_reset.pack(side=tk.LEFT, padx=10)

        # --- 秒表页面 ---
        self.frame_stopwatch = ttk.Frame(self.notebook, padding="20")
        self.notebook.add(self.frame_stopwatch, text="⏱️ 秒表")
        
        self.lbl_sw_display = tk.Label(
            self.frame_stopwatch, 
            text="00:00:00.00", 
            font=("Consolas", 60, "bold"), 
            fg="#0056b3",
            bg="#f0f0f0",
            relief=tk.SUNKEN,
            bd=2
        )
        self.lbl_sw_display.pack(fill=tk.X, pady=40)
        
        btn_frame_sw = ttk.Frame(self.frame_stopwatch)
        btn_frame_sw.pack()
        
        self.btn_sw_start = ttk.Button(btn_frame_sw, text="开始", command=self.start_stopwatch, style='Start.TButton')
        self.btn_sw_start.pack(side=tk.LEFT, padx=10)
        
        self.btn_sw_pause = ttk.Button(btn_frame_sw, text="暂停", command=self.pause_stopwatch, style='Pause.TButton')
        self.btn_sw_pause.pack(side=tk.LEFT, padx=10)
        self.btn_sw_pause.config(state=tk.DISABLED)
        
        self.btn_sw_reset = ttk.Button(btn_frame_sw, text="重置", command=self.reset_stopwatch, style='Reset.TButton')
        self.btn_sw_reset.pack(side=tk.LEFT, padx=10)

    # ================= 倒计时逻辑 =================
    def start_timer(self):
        if not self.timer_running and not self.timer_paused:
            # 全新开始
            try:
                h = int(self.entry_hours.get())
                m = int(self.entry_minutes.get())
                s = int(self.entry_seconds.get())
                total = h * 3600 + m * 60 + s
                if total <= 0:
                    messagebox.showwarning("提示", "时间必须大于0！")
                    return
                self.remaining_seconds = total
                self.original_seconds = total
            except ValueError:
                messagebox.showerror("错误", "请输入有效的数字！")
                return

        self.timer_running = True
        self.timer_paused = False
        self.btn_timer_start.config(state=tk.DISABLED)
        self.btn_timer_pause.config(state=tk.NORMAL)
        self.entry_hours.config(state=tk.DISABLED)
        self.entry_minutes.config(state=tk.DISABLED)
        self.entry_seconds.config(state=tk.DISABLED)
        
        self.run_timer_loop()

    def pause_timer(self):
        if self.timer_running:
            self.timer_running = False
            self.timer_paused = True
            self.btn_timer_start.config(text="继续", state=tk.NORMAL)
            self.btn_timer_pause.config(state=tk.DISABLED)

    def reset_timer(self):
        self.timer_running = False
        self.timer_paused = False
        self.remaining_seconds = 0
        self.update_timer_display(0)
        self.btn_timer_start.config(text="开始", state=tk.NORMAL)
        self.btn_timer_pause.config(state=tk.DISABLED)
        self.entry_hours.config(state=tk.NORMAL)
        self.entry_minutes.config(state=tk.NORMAL)
        self.entry_seconds.config(state=tk.NORMAL)

    def run_timer_loop(self):
        if self.timer_running and self.remaining_seconds > 0:
            self.update_timer_display(self.remaining_seconds)
            self.remaining_seconds -= 1
            self.root.after(1000, self.run_timer_loop)
        elif self.timer_running and self.remaining_seconds == 0:
            self.update_timer_display(0)
            self.timer_finished()
        elif self.timer_paused:
            pass # 等待继续

    def update_timer_display(self, seconds):
        h = seconds // 3600
        m = (seconds % 3600) // 60
        s = seconds % 60
        text = f"{h:02d}:{m:02d}:{s:02d}"
        self.lbl_timer_display.config(text=text)
        # 最后10秒变红提醒
        if seconds <= 10 and seconds > 0:
            self.lbl_timer_display.config(fg="#d32f2f")
        else:
            self.lbl_timer_display.config(fg="#333333")

    def timer_finished(self):
        self.timer_running = False
        self.btn_timer_start.config(text="开始", state=tk.NORMAL)
        self.btn_timer_pause.config(state=tk.DISABLED)
        self.entry_hours.config(state=tk.NORMAL)
        self.entry_minutes.config(state=tk.NORMAL)
        self.entry_seconds.config(state=tk.NORMAL)
        
        # 播放声音 (Windows)
        try:
            winsound.MessageBeep(winsound.MB_OK)
            winsound.Beep(1000, 500) # 频率1000Hz, 持续500ms
        except Exception:
            # 非Windows系统或无声卡时忽略
            pass
            
        messagebox.showinfo("时间到！", "倒计时结束！")
        self.lbl_timer_display.config(fg="#333333")

    # ================= 秒表逻辑 =================
    def start_stopwatch(self):
        if not self.stopwatch_running:
            self.stopwatch_running = True
            self.stopwatch_start_time = time.time() - self.stopwatch_elapsed
            self.btn_sw_start.config(state=tk.DISABLED)
            self.btn_sw_pause.config(state=tk.NORMAL)
            self.update_stopwatch()

    def pause_stopwatch(self):
        if self.stopwatch_running:
            self.stopwatch_running = False
            self.stopwatch_elapsed = time.time() - self.stopwatch_start_time
            self.btn_sw_start.config(state=tk.NORMAL)
            self.btn_sw_pause.config(state=tk.DISABLED)

    def reset_stopwatch(self):
        self.stopwatch_running = False
        self.stopwatch_elapsed = 0
        self.lbl_sw_display.config(text="00:00:00.00")
        self.btn_sw_start.config(state=tk.NORMAL)
        self.btn_sw_pause.config(state=tk.DISABLED)

    def update_stopwatch(self):
        if self.stopwatch_running:
            elapsed = time.time() - self.stopwatch_start_time
            hours = int(elapsed // 3600)
            minutes = int((elapsed % 3600) // 60)
            seconds = int(elapsed % 60)
            milliseconds = int((elapsed * 100) % 100) # 显示两位毫秒
            
            text = f"{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:02d}"
            self.lbl_sw_display.config(text=text)
            
            # 每 10ms 更新一次以显示毫秒
            self.root.after(10, self.update_stopwatch)

if __name__ == "__main__":
    root = tk.Tk()
    # 尝试优化高分屏显示
    try:
        from ctypes import windll
        windll.shcore.SetProcessDpiAwareness(1)
    except:
        pass
    
    app = ModernTimerApp(root)
    root.mainloop()