import tkinter as tk
from tkinter import ttk, messagebox
import time
import threading

class TimerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("多功能计时器")
        self.root.geometry("400x350")
        self.root.resizable(False, False)
        
        # 计时器变量
        self.remaining_time = 0
        self.is_running = False
        self.paused = False
        self.timer_thread = None
        
        # 创建界面
        self.create_widgets()
        
    def create_widgets(self):
        # 标题
        title_label = tk.Label(self.root, text="⏱️ 计时器", font=("Arial", 20, "bold"))
        title_label.pack(pady=10)
        
        # 时间显示框架
        self.time_frame = tk.Frame(self.root, bg="black", relief="sunken", bd=3)
        self.time_frame.pack(pady=20, padx=20, fill="both")
        
        self.time_label = tk.Label(
            self.time_frame, 
            text="00:00:00", 
            font=("Digital", 48, "bold"),
            bg="black",
            fg="lime"
        )
        self.time_label.pack(pady=20, padx=20)
        
        # 输入框架
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=10)
        
        # 时、分、秒输入
        tk.Label(input_frame, text="时:", font=("Arial", 12)).grid(row=0, column=0, padx=5)
        self.hours_spinbox = tk.Spinbox(
            input_frame, from_=0, to=99, width=5, font=("Arial", 12),
            command=self.update_time_display
        )
        self.hours_spinbox.grid(row=0, column=1, padx=5)
        self.hours_spinbox.bind("<KeyRelease>", self.update_time_display)
        
        tk.Label(input_frame, text="分:", font=("Arial", 12)).grid(row=0, column=2, padx=5)
        self.minutes_spinbox = tk.Spinbox(
            input_frame, from_=0, to=59, width=5, font=("Arial", 12),
            command=self.update_time_display
        )
        self.minutes_spinbox.grid(row=0, column=3, padx=5)
        self.minutes_spinbox.bind("<KeyRelease>", self.update_time_display)
        
        tk.Label(input_frame, text="秒:", font=("Arial", 12)).grid(row=0, column=4, padx=5)
        self.seconds_spinbox = tk.Spinbox(
            input_frame, from_=0, to=59, width=5, font=("Arial", 12),
            command=self.update_time_display
        )
        self.seconds_spinbox.grid(row=0, column=5, padx=5)
        self.seconds_spinbox.bind("<KeyRelease>", self.update_time_display)
        
        # 预设时间按钮框架
        preset_frame = tk.Frame(self.root)
        preset_frame.pack(pady=10)
        
        presets = [("1分钟", 60), ("5分钟", 300), ("10分钟", 600), ("30分钟", 1800)]
        for text, seconds in presets:
            btn = tk.Button(
                preset_frame, text=text, width=8,
                command=lambda s=seconds: self.set_preset_time(s)
            )
            btn.pack(side="left", padx=5)
        
        # 控制按钮框架
        control_frame = tk.Frame(self.root)
        control_frame.pack(pady=10)
        
        self.start_button = tk.Button(
            control_frame, text="开始", command=self.start_timer,
            bg="green", fg="white", font=("Arial", 12, "bold"), width=8
        )
        self.start_button.pack(side="left", padx=5)
        
        self.pause_button = tk.Button(
            control_frame, text="暂停", command=self.pause_timer,
            bg="orange", fg="white", font=("Arial", 12, "bold"), width=8,
            state="disabled"
        )
        self.pause_button.pack(side="left", padx=5)
        
        self.reset_button = tk.Button(
            control_frame, text="重置", command=self.reset_timer,
            bg="gray", fg="white", font=("Arial", 12, "bold"), width=8
        )
        self.reset_button.pack(side="left", padx=5)
        
        # 进度条
        self.progress = ttk.Progressbar(self.root, orient="horizontal", length=350, mode="determinate")
        self.progress.pack(pady=10)
        
        # 状态标签
        self.status_label = tk.Label(self.root, text="就绪", font=("Arial", 10), fg="gray")
        self.status_label.pack(pady=5)
        
        # 初始化时间显示
        self.update_time_display()
        
    def update_time_display(self, event=None):
        """更新时间显示（从输入框读取）"""
        if not self.is_running:
            try:
                hours = int(self.hours_spinbox.get() or 0)
                minutes = int(self.minutes_spinbox.get() or 0)
                seconds = int(self.seconds_spinbox.get() or 0)
                
                # 限制分钟和秒的范围
                minutes = min(max(minutes, 0), 59)
                seconds = min(max(seconds, 0), 59)
                
                self.minutes_spinbox.delete(0, tk.END)
                self.minutes_spinbox.insert(0, str(minutes))
                self.seconds_spinbox.delete(0, tk.END)
                self.seconds_spinbox.insert(0, str(seconds))
                
                total_seconds = hours * 3600 + minutes * 60 + seconds
                self.remaining_time = total_seconds
                self.update_display()
                self.update_progress()
            except ValueError:
                pass
    
    def update_display(self):
        """更新标签显示"""
        if self.remaining_time < 0:
            self.remaining_time = 0
            
        hours = self.remaining_time // 3600
        minutes = (self.remaining_time % 3600) // 60
        seconds = self.remaining_time % 60
        
        time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
        self.time_label.config(text=time_str)
        
    def update_progress(self):
        """更新进度条"""
        if hasattr(self, 'initial_time') and self.initial_time > 0:
            progress_value = (self.initial_time - self.remaining_time) / self.initial_time * 100
            self.progress['value'] = progress_value
        else:
            self.progress['value'] = 0
    
    def set_preset_time(self, seconds):
        """设置预设时间"""
        if not self.is_running:
            hours = seconds // 3600
            minutes = (seconds % 3600) // 60
            secs = seconds % 60
            
            self.hours_spinbox.delete(0, tk.END)
            self.hours_spinbox.insert(0, str(hours))
            self.minutes_spinbox.delete(0, tk.END)
            self.minutes_spinbox.insert(0, str(minutes))
            self.seconds_spinbox.delete(0, tk.END)
            self.seconds_spinbox.insert(0, str(secs))
            
            self.update_time_display()
    
    def start_timer(self):
        """开始计时"""
        if self.remaining_time > 0 and not self.is_running:
            self.is_running = True
            self.paused = False
            
            # 记录初始时间用于进度条
            if self.remaining_time > 0:
                self.initial_time = self.remaining_time
            
            # 禁用输入控件
            self.hours_spinbox.config(state="disabled")
            self.minutes_spinbox.config(state="disabled")
            self.seconds_spinbox.config(state="disabled")
            
            # 更新按钮状态
            self.start_button.config(state="disabled", bg="darkgreen")
            self.pause_button.config(state="normal", bg="darkorange")
            self.reset_button.config(state="normal")
            
            self.status_label.config(text="计时中...", fg="blue")
            
            # 启动计时线程
            self.timer_thread = threading.Thread(target=self.run_timer, daemon=True)
            self.timer_thread.start()
    
    def run_timer(self):
        """计时器运行逻辑"""
        while self.is_running and self.remaining_time > 0:
            if not self.paused:
                time.sleep(1)
                self.remaining_time -= 1
                
                # 更新UI（需要在主线程中执行）
                self.root.after(0, self.update_display)
                self.root.after(0, self.update_progress)
                
        if self.remaining_time <= 0 and self.is_running:
            # 计时结束
            self.root.after(0, self.timer_finished)
    
    def timer_finished(self):
        """计时结束"""
        self.is_running = False
        self.paused = False
        
        # 启用输入控件
        self.hours_spinbox.config(state="normal")
        self.minutes_spinbox.config(state="normal")
        self.seconds_spinbox.config(state="normal")
        
        # 更新按钮状态
        self.start_button.config(state="normal", bg="green")
        self.pause_button.config(state="disabled", bg="orange")
        
        self.status_label.config(text="计时结束！", fg="red")
        
        # 弹出提示框
        messagebox.showinfo("计时器", "时间到！")
        
        # 播放系统提示音（可选）
        try:
            import winsound
            winsound.Beep(1000, 500)
        except:
            pass  # 非Windows系统忽略
    
    def pause_timer(self):
        """暂停/继续计时"""
        if self.is_running:
            if self.paused:
                self.paused = False
                self.pause_button.config(text="暂停", bg="darkorange")
                self.status_label.config(text="计时中...", fg="blue")
            else:
                self.paused = True
                self.pause_button.config(text="继续", bg="darkorange")
                self.status_label.config(text="已暂停", fg="orange")
    
    def reset_timer(self):
        """重置计时器"""
        self.is_running = False
        self.paused = False
        
        # 启用输入控件
        self.hours_spinbox.config(state="normal")
        self.minutes_spinbox.config(state="normal")
        self.seconds_spinbox.config(state="normal")
        
        # 重置按钮状态
        self.start_button.config(state="normal", bg="green")
        self.pause_button.config(state="disabled", text="暂停", bg="orange")
        self.pause_button.config(state="disabled")
        self.reset_button.config(state="normal")
        
        # 重置时间和显示
        self.update_time_display()
        self.status_label.config(text="已重置", fg="gray")
        self.progress['value'] = 0

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