import tkinter as tk
import time
import random

class TypingTutor:
    def __init__(self, root):
        self.root = root
        self.root.title("Python 桌面打字练习器")
        self.root.geometry("800x500")
        self.root.configure(bg="#f0f0f0")

        # 练习文本库
        self.sample_texts = [
            "The quick brown fox jumps over the lazy dog.",
            "Python is a high-level general-purpose programming language.",
            "Success is not final, failure is not fatal: it is the courage to continue that counts.",
            "Practice makes perfect. Keep typing every day to improve your speed.",
            "Artificial intelligence is the simulation of human intelligence by machines."
        ]

        self.current_text = ""
        self.start_time = None
        
        # --- UI 界面布局 ---
        
        # 标题
        self.label_title = tk.Label(root, text="打字速度测试", font=("微软雅黑", 24, "bold"), bg="#f0f0f0", fg="#333")
        self.label_title.pack(pady=20)

        # 显示待输入的文本
        self.text_display = tk.Label(root, text="", font=("Consolas", 16), bg="white", 
                                     wraplength=700, justify="left", relief="groove", padx=10, pady=10)
        self.text_display.pack(pady=10, padx=50, fill="x")

        # 输入框
        self.entry = tk.Entry(root, font=("Consolas", 16), width=50)
        self.entry.pack(pady=20)
        self.entry.bind("<KeyRelease>", self.check_typing) # 绑定按键释放事件

        # 实时数据统计 (速度, 准确率)
        self.stats_frame = tk.Frame(root, bg="#f0f0f0")
        self.stats_frame.pack(pady=10)

        self.label_wpm = tk.Label(self.stats_frame, text="速度: 0 WPM", font=("微软雅黑", 12), bg="#f0f0f0")
        self.label_wpm.pack(side=tk.LEFT, padx=20)

        self.label_accuracy = tk.Label(self.stats_frame, text="准确率: 100%", font=("微软雅黑", 12), bg="#f0f0f0")
        self.label_accuracy.pack(side=tk.LEFT, padx=20)

        # 按钮控制
        self.btn_reset = tk.Button(root, text="开始新练习", command=self.reset_test, 
                                   font=("微软雅黑", 12), bg="#0078d7", fg="white", padx=20)
        self.btn_reset.pack(pady=20)

        # 初始化练习
        self.reset_test()

    def reset_test(self):
        """重置测试状态"""
        self.current_text = random.choice(self.sample_texts)
        self.text_display.config(text=self.current_text, fg="black")
        self.entry.delete(0, tk.END)
        self.entry.config(state="normal")
        self.entry.focus()
        self.start_time = None
        self.label_wpm.config(text="速度: 0 WPM")
        self.label_accuracy.config(text="准确率: 100%")

    def check_typing(self, event):
        """核心逻辑：检查输入对错并计算数据"""
        if not self.start_time:
            self.start_time = time.time()

        user_input = self.entry.get()
        target_text = self.current_text

        # 1. 实时变色反馈
        # 如果输入错误，背景变淡红色
        if not target_text.startswith(user_input):
            self.entry.config(bg="#ffcccc")
        else:
            self.entry.config(bg="white")

        # 2. 计算准确率
        correct_chars = 0
        min_len = min(len(user_input), len(target_text))
        for i in range(min_len):
            if user_input[i] == target_text[i]:
                correct_chars += 1
        
        accuracy = (correct_chars / len(user_input) * 100) if len(user_input) > 0 else 100
        self.label_accuracy.config(text=f"准确率: {int(accuracy)}%")

        # 3. 计算速度 (WPM - Words Per Minute)
        # 这里的公式通常是：(总字符数 / 5) / 分钟
        elapsed_time = (time.time() - self.start_time) / 60
        if elapsed_time > 0:
            wpm = (len(user_input) / 5) / elapsed_time
            self.label_wpm.config(text=f"速度: {int(wpm)} WPM")

        # 4. 检查是否完成
        if user_input == target_text:
            self.entry.config(state="disabled", bg="#ccffcc")
            self.text_display.config(fg="green")
            final_time = round(time.time() - self.start_time, 2)
            tk.messagebox.showinfo("完成!", f"恭喜！你完成了练习。\n用时: {final_time}秒\n最终速度: {self.label_wpm.cget('text')}")

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