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

# 练习文本库
text_list = [
    "人生如逆旅，我亦是行人。愿你遍历山河，仍觉人间值得。",
    "The quick brown fox jumps over the lazy dog. This sentence contains every letter.",
    "编程是逻辑与创意的结合，耐心调试每一处bug，才能写出流畅好用的程序。",
    "面朝大海，春暖花开。从明天起，做一个幸福的人，喂马劈柴，周游世界。",
    "Life is not about waiting for the storm to pass, but learning how to dance in the rain."
]

class TypingTestApp:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习小工具")
        self.root.geometry("750x520")
        self.root.resizable(False, False)

        # 变量初始化
        self.start_time = None
        self.is_start = False
        self.target_text = ""

        # 界面组件
        self.create_widgets()
        self.reset_text()

    def create_widgets(self):
        # 标题
        title_label = tk.Label(self.root, text="打字练习软件", font=("微软雅黑", 18, "bold"))
        title_label.pack(pady=10)

        # 参考文本区域
        frame_ref = tk.LabelFrame(self.root, text="对照文本", font=("微软雅黑", 11))
        frame_ref.pack(fill="x", padx=20, pady=5)
        self.ref_text = tk.Text(frame_ref, height=5, font=("微软雅黑", 12), wrap="word")
        self.ref_text.pack(fill="both", padx=5, pady=5)
        self.ref_text.config(state=tk.DISABLED)

        # 输入区域
        frame_input = tk.LabelFrame(self.root, text="在此输入", font=("微软雅黑", 11))
        frame_input.pack(fill="x", padx=20, pady=5)
        self.input_text = tk.Text(frame_input, height=5, font=("微软雅黑", 12), wrap="word")
        self.input_text.pack(fill="both", padx=5, pady=5)
        self.input_text.bind("<KeyPress>", self.on_key_press)

        # 状态栏信息
        info_frame = tk.Frame(self.root)
        info_frame.pack(pady=8)

        self.time_label = tk.Label(info_frame, text="用时：0.00 s", font=("微软雅黑", 11))
        self.time_label.grid(row=0, column=0, padx=15)

        self.speed_label = tk.Label(info_frame, text="速度：0 WPM", font=("微软雅黑", 11))
        self.speed_label.grid(row=0, column=1, padx=15)

        self.acc_label = tk.Label(info_frame, text="正确率：0%", font=("微软雅黑", 11))
        self.acc_label.grid(row=0, column=2, padx=15)

        # 按钮区
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=10)

        ttk.Button(btn_frame, text="重新开始", command=self.reset_text).grid(row=0, column=0, padx=10)
        ttk.Button(btn_frame, text="更换文本", command=self.change_text).grid(row=0, column=1, padx=10)
        ttk.Button(btn_frame, text="结束统计", command=self.finish_test).grid(row=0, column=2, padx=10)

    def reset_text(self):
        """重置所有数据，清空输入，随机选文"""
        self.target_text = random.choice(text_list)
        self.ref_text.config(state=tk.NORMAL)
        self.ref_text.delete(1.0, tk.END)
        self.ref_text.insert(tk.END, self.target_text)
        self.ref_text.config(state=tk.DISABLED)

        self.input_text.delete(1.0, tk.END)
        self.start_time = None
        self.is_start = False
        self.time_label.config(text="用时：0.00 s")
        self.speed_label.config(text="速度：0 WPM")
        self.acc_label.config(text="正确率：0%")

    def change_text(self):
        """只换文本不重置输入"""
        self.target_text = random.choice(text_list)
        self.ref_text.config(state=tk.NORMAL)
        self.ref_text.delete(1.0, tk.END)
        self.ref_text.insert(tk.END, self.target_text)
        self.ref_text.config(state=tk.DISABLED)

    def on_key_press(self, event):
        """首次按键开始计时"""
        if not self.is_start:
            self.start_time = time.time()
            self.is_start = True
            self.update_timer()

    def update_timer(self):
        """实时刷新时间"""
        if self.is_start and self.start_time:
            used = round(time.time() - self.start_time, 2)
            self.time_label.config(text=f"用时：{used} s")
            self.root.after(100, self.update_timer)

    def finish_test(self):
        """结束打字，计算速度与正确率"""
        if not self.is_start:
            messagebox.showinfo("提示", "还没有开始输入！")
            return

        end_time = time.time()
        total_time = end_time - self.start_time
        user_input = self.input_text.get(1.0, tk.END).strip()

        # 逐字符比对计算正确字数
        correct = 0
        min_len = min(len(user_input), len(self.target_text))
        for i in range(min_len):
            if user_input[i] == self.target_text[i]:
                correct += 1

        total_len = len(self.target_text)
        accuracy = (correct / total_len) * 100 if total_len != 0 else 0
        # WPM：英文按单词，中文按字符换算
        wpm = round((len(user_input) / total_time) * 60)

        # 更新显示
        self.speed_label.config(text=f"速度：{wpm} WPM")
        self.acc_label.config(text=f"正确率：{accuracy:.1f}%")
        self.is_start = False

        messagebox.showinfo("测试结果",
                            f"总用时：{total_time:.2f} 秒\n"
                            f"正确字符：{correct}/{total_len}\n"
                            f"打字速度：{wpm} 字符/分钟\n"
                            f"正确率：{accuracy:.1f}%")

if __name__ == "__main__":
    main_window = tk.Tk()
    app = TypingTestApp(main_window)
    main_window.mainloop()
