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

class TypingTutor:
    def __init__(self, root):
        self.root = root
        self.root.title("Python 打字练习助手")
        self.root.geometry("800x500")
        self.root.configure(bg="#f0f2f5")

        # 练习库
        self.sample_texts = [
            "The quick brown fox jumps over the lazy dog.",
            "Python is a high-level, interpreted programming language.",
            "Practice makes perfect when it comes to coding skills.",
            "Success is not final, failure is not fatal: it is the courage to continue that counts.",
            "Stay hungry, stay foolish, and always keep learning new things.",
            "Beautiful is better than ugly. Explicit is better than implicit."
        ]

        self.target_text = ""
        self.start_time = None
        
        self._setup_ui()
        self._reset_test()

    def _setup_ui(self):
        # 顶部标题
        tk.Label(self.root, text="打字速度测试", font=("微软雅黑", 20, "bold"), bg="#f0f2f5", fg="#333").pack(pady=20)

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

        # 输入框
        self.input_entry = tk.Entry(self.root, font=("Consolas", 16), width=50, relief="flat", bd=5)
        self.input_entry.pack(pady=20)
        self.input_entry.bind("<KeyRelease>", self._handle_keypress) # 监听按键

        # 实时数据面板
        stats_frame = tk.Frame(self.root, bg="#f0f2f5")
        stats_frame.pack(pady=20)

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

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

        # 按钮
        tk.Button(self.root, text="下一句 / 重置", command=self._reset_test, bg="#2196F3", fg="white", font=("微软雅黑", 10), padx=15).pack()

    def _reset_test(self):
        """重置测试状态"""
        self.target_text = random.choice(self.sample_texts)
        self.display_label.config(text=self.target_text, fg="black")
        self.input_entry.delete(0, tk.END)
        self.input_entry.config(state="normal")
        self.input_entry.focus()
        self.start_time = None
        self.wpm_label.config(text="速度: 0 WPM")
        self.acc_label.config(text="准确率: 100%")

    def _handle_keypress(self, event):
        """处理用户输入"""
        if not self.start_time:
            self.start_time = time.time()

        user_input = self.input_entry.get()
        target_part = self.target_text[:len(user_input)]

        # 实时反馈：如果输错了，输入框变红，否则变绿/白
        if user_input == target_part:
            self.input_entry.config(fg="green")
        else:
            self.input_entry.config(fg="red")

        # 计算数据
        self._update_stats(user_input)

        # 检查是否完成
        if user_input == self.target_text:
            self._finish_test()

    def _update_stats(self, user_input):
        """更新速度和准确率"""
        if not self.start_time: return
        
        # 计算时间（分钟）
        elapsed_time = (time.time() - self.start_time) / 60
        if elapsed_time <= 0: elapsed_time = 0.001

        # 速度计算 (WPM = 总单词数 / 分钟)
        # 单词通常按5个字符算一个
        words = len(user_input) / 5
        wpm = round(words / elapsed_time)
        self.wpm_label.config(text=f"速度: {wpm} WPM")

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

    def _finish_test(self):
        """测试结束"""
        elapsed_time = round(time.time() - self.start_time, 2)
        self.input_entry.config(state="disabled")
        messagebox.showinfo("测试完成", f"恭喜！你完成了练习。\n用时: {elapsed_time}秒\n{self.wpm_label.cget('text')}")

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