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

# 示例文本库
TEXTS = [
    "The quick brown fox jumps over the lazy dog.",
    "Python is a great programming language for beginners.",
    "Typing speed improves with regular practice and focus.",
    "GUI applications can be built easily using Tkinter.",
    "Consistency is the key to mastering any skill."
]

class TypingApp:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习软件")
        self.root.geometry("600x400")

        self.text_to_type = ""
        self.start_time = None

        self.create_widgets()
        self.new_text()

    def create_widgets(self):
        # 显示目标文本
        self.label_text = tk.Label(
            self.root,
            text="",
            font=("Arial", 14),
            wraplength=500,
            justify="left"
        )
        self.label_text.pack(pady=10)

        # 输入框
        self.entry = tk.Text(
            self.root,
            height=4,
            font=("Arial", 12)
        )
        self.entry.pack(pady=10)
        self.entry.bind("<KeyRelease>", self.check_typing)

        # 状态显示
        self.status_label = tk.Label(
            self.root,
            text="准备开始...",
            font=("Arial", 12)
        )
        self.status_label.pack(pady=5)

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

        self.start_btn = tk.Button(
            btn_frame,
            text="开始 / 重来",
            command=self.new_text
        )
        self.start_btn.pack(side=tk.LEFT, padx=10)

    def new_text(self):
        self.text_to_type = random.choice(TEXTS)
        self.label_text.config(text=self.text_to_type)
        self.entry.delete("1.0", tk.END)
        self.status_label.config(text="开始打字吧！")
        self.start_time = time.time()

    def check_typing(self, event=None):
        if not self.text_to_type:
            return

        typed_text = self.entry.get("1.0", tk.END).strip()
        correct_chars = 0

        for i, ch in enumerate(typed_text):
            if i < len(self.text_to_type) and ch == self.text_to_type[i]:
                correct_chars += 1

        total_chars = len(typed_text)
        accuracy = (correct_chars / total_chars * 100) if total_chars > 0 else 0

        elapsed_time = time.time() - self.start_time
        words = len(self.text_to_type.split())
        wpm = int((words / elapsed_time) * 60) if elapsed_time > 0 else 0

        self.status_label.config(
            text=f"速度: {wpm} WPM | 正确率: {accuracy:.1f}%"
        )

        if typed_text == self.text_to_type:
            messagebox.showinfo(
                "完成",
                f"🎉 完成！\n速度: {wpm} WPM\n正确率: {accuracy:.1f}%"
            )

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