import tkinter as tk
from tkinter import ttk, messagebox
import time
import threading
import winsound  # Windows系统的声音模块
# 如果你在Mac或Linux系统，可以注释掉winsound并使用下面的替代方案
# import os  # 用于beep声音


class TimerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Python定时器")
        self.root.geometry("400x300")
        self.root.resizable(False, False)

        # 定时器状态变量
        self.is_running = False
        self.is_paused = False
        self.total_seconds = 0
        self.remaining_seconds = 0
        self.timer_thread = None

        # 创建界面
        self.create_widgets()

    def create_widgets(self):
        # 主框架
        main_frame = ttk.Frame(self.root, padding="20")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))

        # 时间输入框
        ttk.Label(main_frame, text="设置时间 (分钟):", font=("Arial", 12)).grid(
            row=0, column=0, columnspan=2, pady=(0, 10))

        self.time_var = tk.StringVar(value="5")
        time_entry = ttk.Entry(main_frame, textvariable=self.time_var,
                               font=("Arial", 14), width=10, justify='center')
        time_entry.grid(row=1, column=0, columnspan=2, pady=(0, 20))

        # 时间显示
        self.time_display = ttk.Label(main_frame, text="00:00",
                                      font=("Arial", 36, "bold"))
        self.time_display.grid(row=2, column=0, columnspan=2, pady=(0, 20))

        # 按钮框架
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=3, column=0, columnspan=2, pady=(0, 10))

        # 开始按钮
        self.start_btn = ttk.Button(button_frame, text="开始",
                                    command=self.start_timer, width=10)
        self.start_btn.grid(row=0, column=0, padx=5)

        # 暂停/继续按钮
        self.pause_btn = ttk.Button(button_frame, text="暂停",
                                    command=self.pause_timer, width=10, state='disabled')
        self.pause_btn.grid(row=0, column=1, padx=5)

        # 重置按钮
        self.reset_btn = ttk.Button(button_frame, text="重置",
                                    command=self.reset_timer, width=10)
        self.reset_btn.grid(row=0, column=2, padx=5)

        # 状态标签
        self.status_label = ttk.Label(main_frame, text="准备就绪",
                                      font=("Arial", 10), foreground="gray")
        self.status_label.grid(row=4, column=0, columnspan=2, pady=(10, 0))

        # 配置网格权重
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)
        main_frame.columnconfigure(0, weight=1)
        main_frame.columnconfigure(1, weight=1)

    def start_timer(self):
        """开始定时器"""
        if self.is_running and not self.is_paused:
            return

        try:
            minutes = float(self.time_var.get())
            if minutes <= 0:
                messagebox.showerror("错误", "请输入大于0的时间！")
                return
        except ValueError:
            messagebox.showerror("错误", "请输入有效数字！")
            return

        if not self.is_running or self.is_paused:
            if self.is_paused:
                # 继续计时
                self.is_paused = False
                self.status_label.config(text="运行中...")
            else:
                # 新开始计时
                self.total_seconds = int(minutes * 60)
                self.remaining_seconds = self.total_seconds
                self.is_running = True
                self.status_label.config(text="运行中...")

                # 启动计时线程
                self.timer_thread = threading.Thread(
                    target=self.run_timer, daemon=True)
                self.timer_thread.start()

            # 更新按钮状态
            self.start_btn.config(state='disabled')
            self.pause_btn.config(state='normal', text="暂停")
            self.reset_btn.config(state='normal')

    def pause_timer(self):
        """暂停或继续定时器"""
        if self.is_paused:
            # 继续计时
            self.is_paused = False
            self.pause_btn.config(text="暂停")
            self.status_label.config(text="运行中...")
        else:
            # 暂停计时
            self.is_paused = True
            self.pause_btn.config(text="继续")
            self.status_label.config(text="已暂停")

    def reset_timer(self):
        """重置定时器"""
        self.is_running = False
        self.is_paused = False
        self.remaining_seconds = 0

        # 更新界面
        self.update_display()
        self.start_btn.config(state='normal')
        self.pause_btn.config(state='disabled', text="暂停")
        self.status_label.config(text="已重置")

    def run_timer(self):
        """运行定时器的主循环"""
        while self.remaining_seconds > 0 and self.is_running:
            if not self.is_paused:
                time.sleep(1)
                self.remaining_seconds -= 1
                # 在主线程中更新UI
                self.root.after(0, self.update_display)
            else:
                time.sleep(0.1)  # 暂停时减少CPU占用

        # 计时结束
        if self.remaining_seconds <= 0 and self.is_running:
            self.is_running = False
            self.root.after(0, self.timer_finished)

    def update_display(self):
        """更新时间显示"""
        minutes = self.remaining_seconds // 60
        seconds = self.remaining_seconds % 60
        time_str = f"{minutes:02d}:{seconds:02d}"
        self.time_display.config(text=time_str)

    def timer_finished(self):
        """定时器结束时的处理"""
        self.is_running = False
        self.start_btn.config(state='normal')
        self.pause_btn.config(state='disabled')
        self.status_label.config(text="时间到！", foreground="red")

        # 播放提示音
        self.play_beep_sound()

        # 显示完成对话框
        messagebox.showinfo("定时器", "时间到！")
        self.status_label.config(foreground="gray")

    def play_beep_sound(self):
        """播放提示音"""
        try:
            # Windows系统
            winsound.Beep(1000, 1000)  # 频率1000Hz，持续1000ms
            winsound.Beep(1200, 500)
            winsound.Beep(800, 500)
        except:
            # 如果winsound不可用（非Windows系统），尝试其他方法
            try:
                # 尝试使用os.system播放声音
                import os
                if os.name == 'nt':  # Windows
                    os.system('echo \a')
                else:  # Mac/Linux
                    os.system('printf "\a"')
            except:
                pass  # 如果都无法播放，就静音


def main():
    root = tk.Tk()
    app = TimerApp(root)
    root.mainloop()


if __name__ == "__main__":
    main()
