import tkinter as tk
import random
import time

# 练习文本库
TEXT_SAMPLES = [
    "The quick brown fox jumps over the lazy dog.",
    "Python is a high-level programming language.",
    "Practice makes perfect when learning to code.",
    "Artificial intelligence is changing the world.",
    "Keep calm and carry on typing every day.",
    "Programming is the art of telling a computer what to do."
]


class TypingTutor:
    def __init__(self, root):
        self.root = root
        self.root.title("Python 高速打字练习器")
        self.root.geometry("800x500")
        self.root.configure(bg="#f0f0f0")

        # 变量初始化
        self.target_text = ""
        self.start_time = None
        self.running = False

        # --- UI 布局 ---
        # 标题
        self.label_title = tk.Label(root, text="打字速度测试", font=(
            "Helvetica", 24, "bold"), bg="#f0f0f0")
        self.label_title.pack(pady=20)

        # 显示待输入的文本
        self.sample_label = tk.Label(root, text="", font=("Consolas", 16), fg="#666", bg="white",
                                     wraplength=700, justify="left", padx=10, pady=10)
        self.sample_label.pack(pady=10)

        # 输入框
        self.input_entry = tk.Entry(root, font=("Consolas", 16), width=50)
        self.input_entry.pack(pady=20)
        self.input_entry.bind("<KeyRelease>", self.check_typing)  # 监听按键释放

        # 结果显示 (WPM 和 准确率)
        self.res_label = tk.Label(
            root, text="速度: 0 WPM | 准确率: 0%", font=("Helvetica", 14), bg="#f0f0f0")
        self.res_label.pack(pady=10)

        # 按钮控制
        self.btn_start = tk.Button(root, text="开始新练习", command=self.reset_test, font=(
            "Helvetica", 12), bg="#4CAF50", fg="white")
        self.btn_start.pack(pady=10)

        self.reset_test()

    def reset_test(self):
        """重置测试状态"""
        self.target_text = random.choice(TEXT_SAMPLES)
        self.sample_label.config(text=self.target_text)
        self.input_entry.delete(0, tk.END)
        self.input_entry.config(fg="black")
        self.res_label.config(text="速度: 0 WPM | 准确率: 0%", fg="black")
        self.start_time = None
        self.running = False
        self.input_entry.focus()

    def check_typing(self, event):
        """核心逻辑：检查输入正确性并计算得分"""
        if not self.running:
            self.start_time = time.time()
            self.running = True

        user_input = self.input_entry.get()
        target_part = self.target_text[:len(user_input)]

        # 1. 实时变色逻辑
        if user_input == target_part:
            self.input_entry.config(fg="green")  # 输入正确
        else:
            self.input_entry.config(fg="red")   # 输入错误

        # 2. 计算准确率
        correct_chars = sum(1 for i, c in enumerate(user_input) if i < len(
            self.target_text) and c == self.target_text[i])
        accuracy = (correct_chars / len(user_input) *
                    100) if len(user_input) > 0 else 0

        # 3. 计算速度 (WPM - Words Per Minute)
        # 标准公式：(总字符数 / 5) / 分钟数
        time_elapsed = max(time.time() - self.start_time, 1)
        wpm = (len(user_input) / 5) / (time_elapsed / 60)

        self.res_label.config(
            text=f"速度: {int(wpm)} WPM | 准确率: {int(accuracy)}%")

        # 4. 完成检查
        if user_input == self.target_text:
            self.running = False
            self.input_entry.config(fg="#4CAF50")
            messagebox.showinfo(
                "完成!", f"挑战成功！\n最终速度: {int(wpm)} WPM\n准确率: {int(accuracy)}%")
            self.reset_test()


if __name__ == "__main__":
    from tkinter import messagebox
    root = tk.Tk()
    app = TypingTutor(root)
    root.mainloop()
