import tkinter as tk
from tkinter import ttk
import time

class StopwatchApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Python 桌面秒表")
        self.root.geometry("350x450")
        self.root.configure(bg="#2c3e50")

        # 计时变量
        self.running = False
        self.start_time = 0.0
        self.elapsed_time = 0.0
        self.laps = []

        self.setup_ui()

    def setup_ui(self):
        # 时间显示区域
        self.label_display = tk.Label(
            self.root, text="00:00.00", 
            font=("Courier New", 40, "bold"), 
            fg="#ecf0f1", bg="#2c3e50"
        )
        self.label_display.pack(pady=30)

        # 按钮容器
        btn_frame = tk.Frame(self.root, bg="#2c3e50")
        btn_frame.pack(pady=10)

        # 开始/暂停按钮
        self.btn_start = tk.Button(
            btn_frame, text="开始", command=self.toggle,
            width=8, bg="#27ae60", fg="white", font=("微软雅黑", 10, "bold")
        )
        self.btn_start.pack(side=tk.LEFT, padx=5)

        # 计次按钮
        self.btn_lap = tk.Button(
            btn_frame, text="计次", command=self.record_lap,
            width=8, bg="#2980b9", fg="white", font=("微软雅黑", 10, "bold"),
            state=tk.DISABLED
        )
        self.btn_lap.pack(side=tk.LEFT, padx=5)

        # 重置按钮
        self.btn_reset = tk.Button(
            btn_frame, text="重置", command=self.reset,
            width=8, bg="#e74c3c", fg="white", font=("微软雅黑", 10, "bold")
        )
        self.btn_reset.pack(side=tk.LEFT, padx=5)

        # 计次记录列表
        self.lap_list = tk.Listbox(
            self.root, font=("微软雅黑", 10), 
            bg="#34495e", fg="#bdc3c7", borderwidth=0, highlightthickness=0
        )
        self.lap_list.pack(padx=20, pady=20, fill=tk.BOTH, expand=True)

    def update_clock(self):
        """核心刷新逻辑"""
        if self.running:
            # 计算当前流逝的总时间
            self.elapsed_time = time.time() - self.start_time
            self.display_time(self.elapsed_time)
            # 每10毫秒刷新一次，保证毫秒位的流畅
            self.root.after(10, self.update_clock)

    def display_time(self, t):
        """格式化时间显示"""
        mins = int(t // 60)
        secs = int(t % 60)
        msecs = int((t % 1) * 100)
        time_str = f"{mins:02d}:{secs:02d}.{msecs:02d}"
        self.label_display.config(text=time_str)
        return time_str

    def toggle(self):
        """切换开始和暂停状态"""
        if not self.running:
            # 开始计时
            self.running = True
            self.start_time = time.time() - self.elapsed_time
            self.update_clock()
            self.btn_start.config(text="暂停", bg="#f39c12")
            self.btn_lap.config(state=tk.NORMAL)
        else:
            # 暂停计时
            self.running = False
            self.btn_start.config(text="继续", bg="#27ae60")
            self.btn_lap.config(state=tk.DISABLED)

    def record_lap(self):
        """记录当前时间点"""
        current_time = self.label_display.cget("text")
        self.laps.append(current_time)
        self.lap_list.insert(tk.END, f"计次 {len(self.laps)}:   {current_time}")
        self.lap_list.see(tk.END) # 自动滚动到底部

    def reset(self):
        """重置所有数据"""
        self.running = False
        self.elapsed_time = 0.0
        self.laps = []
        self.label_display.config(text="00:00.00")
        self.btn_start.config(text="开始", bg="#27ae60")
        self.btn_lap.config(state=tk.DISABLED)
        self.lap_list.delete(0, tk.END)

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