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("400x500")
        self.root.resizable(False, False)
        
        # 定时器变量
        self.remaining_time = 0  # 剩余时间（秒）
        self.is_running = False
        self.is_paused = False
        
        # 设置界面
        self.setup_ui()
        
    def setup_ui(self):
        # 标题
        title_label = tk.Label(self.root, text="⏰ 定时器", font=("Arial", 24, "bold"))
        title_label.pack(pady=20)
        
        # 时间显示区域
        self.time_frame = tk.Frame(self.root, bg="black", relief="ridge", bd=5)
        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"),
            fg="lime",
            bg="black"
        )
        self.time_label.pack(pady=30, padx=20)
        
        # 时间设置区域
        set_frame = tk.LabelFrame(self.root, text="设置时间", font=("Arial", 12, "bold"))
        set_frame.pack(pady=10, padx=20, fill="x")
        
        # 小时
        hour_frame = tk.Frame(set_frame)
        hour_frame.pack(side="left", expand=True, padx=10, pady=10)
        tk.Label(hour_frame, text="小时", font=("Arial", 10)).pack()
        self.hour_spin = tk.Spinbox(hour_frame, from_=0, to=23, width=5, font=("Arial", 12))
        self.hour_spin.pack()
        
        # 分钟
        minute_frame = tk.Frame(set_frame)
        minute_frame.pack(side="left", expand=True, padx=10, pady=10)
        tk.Label(minute_frame, text="分钟", font=("Arial", 10)).pack()
        self.minute_spin = tk.Spinbox(minute_frame, from_=0, to=59, width=5, font=("Arial", 12))
        self.minute_spin.pack()
        
        # 秒
        second_frame = tk.Frame(set_frame)
        second_frame.pack(side="left", expand=True, padx=10, pady=10)
        tk.Label(second_frame, text="秒", font=("Arial", 10)).pack()
        self.second_spin = tk.Spinbox(second_frame, from_=0, to=59, width=5, font=("Arial", 12))
        self.second_spin.pack()
        
        # 快捷时间按钮
        quick_frame = tk.LabelFrame(self.root, text="快捷设置", font=("Arial", 12, "bold"))
        quick_frame.pack(pady=10, padx=20, fill="x")
        
        quick_times = [("1分钟", 60), ("5分钟", 300), ("10分钟", 600), 
                      ("15分钟", 900), ("30分钟", 1800), ("1小时", 3600)]
        
        for i, (text, seconds) in enumerate(quick_times):
            btn = tk.Button(quick_frame, text=text, command=lambda s=seconds: self.set_quick_time(s),
                          width=8, relief="raised", bg="#e0e0e0")
            row = i // 3
            col = i % 3
            btn.grid(row=row, column=col, padx=5, pady=5)
        
        # 控制按钮区域
        control_frame = tk.Frame(self.root)
        control_frame.pack(pady=20)
        
        self.start_btn = tk.Button(control_frame, text="开始", command=self.start_timer,
                                  width=8, height=1, font=("Arial", 12, "bold"),
                                  bg="#4CAF50", fg="white", relief="raised")
        self.start_btn.pack(side="left", padx=5)
        
        self.pause_btn = tk.Button(control_frame, text="暂停", command=self.pause_timer,
                                  width=8, height=1, font=("Arial", 12, "bold"),
                                  bg="#FF9800", fg="white", relief="raised", state="disabled")
        self.pause_btn.pack(side="left", padx=5)
        
        self.reset_btn = tk.Button(control_frame, text="重置", command=self.reset_timer,
                                  width=8, height=1, font=("Arial", 12, "bold"),
                                  bg="#f44336", fg="white", relief="raised")
        self.reset_btn.pack(side="left", padx=5)
        
        # 进度条
        self.progress = ttk.Progressbar(self.root, length=300, 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.root.protocol("WM_DELETE_WINDOW", self.on_closing)
        
    def set_quick_time(self, seconds):
        """快捷设置时间"""
        if not self.is_running:
            self.remaining_time = seconds
            self.update_display()
            # 更新spinbox显示
            hours = seconds // 3600
            minutes = (seconds % 3600) // 60
            secs = seconds % 60
            self.hour_spin.delete(0, tk.END)
            self.hour_spin.insert(0, str(hours))
            self.minute_spin.delete(0, tk.END)
            self.minute_spin.insert(0, str(minutes))
            self.second_spin.delete(0, tk.END)
            self.second_spin.insert(0, str(secs))
            self.status_label.config(text=f"已设置 {self.format_time(seconds)}", fg="blue")
    
    def get_time_from_spinbox(self):
        """从spinbox获取时间"""
        try:
            hours = int(self.hour_spin.get())
            minutes = int(self.minute_spin.get())
            seconds = int(self.second_spin.get())
            return hours * 3600 + minutes * 60 + seconds
        except:
            return 0
    
    def start_timer(self):
        """开始计时"""
        if not self.is_running:
            if self.remaining_time <= 0:
                # 从输入框获取时间
                self.remaining_time = self.get_time_from_spinbox()
                if self.remaining_time <= 0:
                    messagebox.showwarning("警告", "请设置一个大于0的时间！")
                    return
            
            self.is_running = True
            self.is_paused = False
            self.start_btn.config(state="disabled")
            self.pause_btn.config(state="normal", text="暂停")
            self.status_label.config(text="计时中...", fg="green")
            
            # 禁用时间输入
            self.hour_spin.config(state="disabled")
            self.minute_spin.config(state="disabled")
            self.second_spin.config(state="disabled")
            
            # 启动计时线程
            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.is_paused:
                time.sleep(1)
                self.remaining_time -= 1
                # 更新界面（需要在主线程中执行）
                self.root.after(0, self.update_display)
                self.root.after(0, self.update_progress)
                
                # 检查是否时间到
                if self.remaining_time <= 0:
                    self.root.after(0, self.time_up)
                    break
    
    def pause_timer(self):
        """暂停/继续计时"""
        if self.is_running:
            if self.is_paused:
                self.is_paused = False
                self.pause_btn.config(text="暂停")
                self.status_label.config(text="计时中...", fg="green")
            else:
                self.is_paused = True
                self.pause_btn.config(text="继续")
                self.status_label.config(text="已暂停", fg="orange")
    
    def reset_timer(self):
        """重置定时器"""
        self.is_running = False
        self.is_paused = False
        self.remaining_time = 0
        self.update_display()
        self.progress['value'] = 0
        
        self.start_btn.config(state="normal")
        self.pause_btn.config(state="disabled", text="暂停")
        self.status_label.config(text="就绪", fg="gray")
        
        # 启用时间输入
        self.hour_spin.config(state="normal")
        self.minute_spin.config(state="normal")
        self.second_spin.config(state="normal")
        
        # 重置输入框
        self.hour_spin.delete(0, tk.END)
        self.hour_spin.insert(0, "0")
        self.minute_spin.delete(0, tk.END)
        self.minute_spin.insert(0, "0")
        self.second_spin.delete(0, tk.END)
        self.second_spin.insert(0, "0")
    
    def update_display(self):
        """更新时间显示"""
        time_str = self.format_time(self.remaining_time)
        self.time_label.config(text=time_str)
    
    def update_progress(self):
        """更新进度条"""
        total = self.get_time_from_spinbox()
        if total > 0:
            progress_percent = (total - self.remaining_time) / total * 100
            self.progress['value'] = progress_percent
    
    def format_time(self, seconds):
        """格式化时间显示"""
        hours = seconds // 3600
        minutes = (seconds % 3600) // 60
        secs = seconds % 60
        return f"{hours:02d}:{minutes:02d}:{secs:02d}"
    
    def time_up(self):
        """时间到时的处理"""
        self.is_running = False
        self.progress['value'] = 100
        self.status_label.config(text="时间到！", fg="red")
        
        # 弹出提示框
        messagebox.showinfo("定时器", "时间到啦！")
        
        # 重置按钮状态
        self.start_btn.config(state="normal")
        self.pause_btn.config(state="disabled", text="暂停")
        
        # 启用时间输入
        self.hour_spin.config(state="normal")
        self.minute_spin.config(state="normal")
        self.second_spin.config(state="normal")
    
    def on_closing(self):
        """关闭窗口时的处理"""
        if self.is_running:
            if messagebox.askokcancel("退出", "定时器正在运行，确定要退出吗？"):
                self.root.destroy()
        else:
            self.root.destroy()


def main():
    root = tk.Tk()
    app = TimerApp(root)
    root.mainloop()


if __name__ == "__main__":
    main()