import tkinter as tk
from tkinter import messagebox
import time
import threading
import pygame

# 初始化pygame用于播放提示音（可选，无音效也能正常运行）
try:
    pygame.mixer.init()
    ALERT_SOUND = pygame.mixer.Sound("alert.wav")  # 可替换为自己的提示音文件
except:
    ALERT_SOUND = None  # 没有pygame或音效文件则禁用音效

class CountdownTimer:
    def __init__(self, root):
        # 主窗口设置
        self.root = root
        self.root.title("Python 定时器")
        self.root.geometry("400x300")
        self.root.resizable(False, False)

        # 定时器核心变量
        self.remaining_time = 0  # 剩余秒数
        self.is_running = False  # 是否正在计时
        self.timer_thread = None  # 计时线程

        # 1. 创建输入区域（分钟）
        self.label = tk.Label(root, text="设置时间（分钟）：", font=("Arial", 14))
        self.label.pack(pady=10)

        self.time_entry = tk.Entry(root, font=("Arial", 14), width=10)
        self.time_entry.pack(pady=5)
        self.time_entry.insert(0, "1")  # 默认1分钟

        # 2. 创建显示区域
        self.display_label = tk.Label(root, text="00:00:00", font=("Arial", 24, "bold"))
        self.display_label.pack(pady=20)

        # 3. 创建控制按钮
        self.button_frame = tk.Frame(root)
        self.button_frame.pack(pady=10)

        self.start_btn = tk.Button(
            self.button_frame, text="开始", font=("Arial", 12),
            width=8, command=self.start_timer
        )
        self.start_btn.grid(row=0, column=0, padx=5)

        self.pause_btn = tk.Button(
            self.button_frame, text="暂停", font=("Arial", 12),
            width=8, command=self.pause_timer, state=tk.DISABLED
        )
        self.pause_btn.grid(row=0, column=1, padx=5)

        self.reset_btn = tk.Button(
            self.button_frame, text="重置", font=("Arial", 12),
            width=8, command=self.reset_timer
        )
        self.reset_btn.grid(row=0, column=2, padx=5)

    def format_time(self, seconds):
        """将秒数格式化为 时:分:秒 格式"""
        hours = seconds // 3600
        minutes = (seconds % 3600) // 60
        secs = seconds % 60
        return f"{hours:02d}:{minutes:02d}:{secs:02d}"

    def start_timer(self):
        """启动定时器"""
        # 获取输入的分钟数并验证
        try:
            minutes = float(self.time_entry.get())
            if minutes <= 0:
                messagebox.showerror("错误", "请输入大于0的时间！")
                return
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字！")
            return

        # 初始化剩余时间（转换为秒）
        if not self.is_running:
            if self.remaining_time == 0:
                self.remaining_time = int(minutes * 60)
            # 更新显示
            self.display_label.config(text=self.format_time(self.remaining_time))
            # 标记为运行状态
            self.is_running = True
            # 禁用输入框和开始按钮，启用暂停按钮
            self.time_entry.config(state=tk.DISABLED)
            self.start_btn.config(state=tk.DISABLED)
            self.pause_btn.config(state=tk.NORMAL)
            # 启动计时线程（避免界面卡死）
            self.timer_thread = threading.Thread(target=self.countdown)
            self.timer_thread.daemon = True  # 主线程退出时子线程也退出
            self.timer_thread.start()

    def pause_timer(self):
        """暂停定时器"""
        self.is_running = False
        self.start_btn.config(state=tk.NORMAL)
        self.pause_btn.config(state=tk.DISABLED)

    def reset_timer(self):
        """重置定时器"""
        self.is_running = False
        self.remaining_time = 0
        self.display_label.config(text="00:00:00")
        self.time_entry.config(state=tk.NORMAL)
        self.start_btn.config(state=tk.NORMAL)
        self.pause_btn.config(state=tk.DISABLED)

    def countdown(self):
        """计时核心逻辑"""
        while self.is_running and self.remaining_time > 0:
            time.sleep(1)
            self.remaining_time -= 1
            # 更新界面（必须在主线程执行）
            self.root.after(0, lambda: self.display_label.config(text=self.format_time(self.remaining_time)))
        
        # 计时结束
        if self.remaining_time == 0 and self.is_running:
            self.root.after(0, self.timer_finished)

    def timer_finished(self):
        """计时结束后的操作"""
        self.is_running = False
        # 播放提示音
        if ALERT_SOUND:
            ALERT_SOUND.play()
        # 弹出提示框
        messagebox.showinfo("提示", "时间到！")
        # 重置界面状态
        self.reset_timer()

# 运行程序
if __name__ == "__main__":
    root = tk.Tk()
    app = CountdownTimer(root)
    root.mainloop()