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

# 练习文本库
TEXT_LIST = [
    "The quick brown fox jumps over the lazy dog.",
    "Where there is a will, there is a way.",
    "Practice makes perfect, never give up your dream.",
    "Life is not about waiting for the storm to pass.",
    "Success belongs to those who keep trying every day.",
    "千里之行，始于足下。坚持练习才能不断进步。",
    "书山有路勤为径，学海无涯苦作舟。",
    "时光不会辜负每一个默默努力的人。"
]

class TypePracticeApp:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习工具")
        self.root.geometry("720x480")

        # 变量
        self.start_time = None
        self.is_running = False
        self.target_text = ""
        self.correct_count = 0
        self.total_input = 0

        # 界面布局
        self.create_widgets()
        self.new_text()

    def create_widgets(self):
        # 显示目标文本区域
        tk.Label(self.root, text="待输入文本：", font=("微软雅黑",12)).pack(anchor="w", padx=20, pady=(10,0))
        self.label_text = tk.Text(self.root, height=4, font=("微软雅黑",14), wrap="word")
        self.label_text.pack(fill="x", padx=20, pady=5)
        self.label_text.config(state=tk.DISABLED)

        # 输入框
        tk.Label(self.root, text="在此输入：", font=("微软雅黑",12)).pack(anchor="w", padx=20)
        self.input_box = tk.Text(self.root, height=4, font=("微软雅黑",14), wrap="word")
        self.input_box.pack(fill="x", padx=20, pady=5)
        self.input_box.bind("<KeyRelease>", self.check_input)

        # 数据显示区域
        frame_info = tk.Frame(self.root)
        frame_info.pack(pady=10)
        self.label_speed = tk.Label(frame_info, text="速度：0 WPM", font=("微软雅黑",11), width=12)
        self.label_speed.grid(row=0, column=0, padx=8)
        self.label_acc = tk.Label(frame_info, text="正确率：0%", font=("微软雅黑",11), width=12)
        self.label_acc.grid(row=0, column=1, padx=8)
        self.label_time = tk.Label(frame_info, text="用时：0s", font=("微软雅黑",11), width=12)
        self.label_time.grid(row=0, column=2, padx=8)

        # 按钮区域
        frame_btn = tk.Frame(self.root)
        frame_btn.pack(pady=10)
        ttk.Button(frame_btn, text="重新开始", command=self.reset).grid(row=0, column=0, padx=10)
        ttk.Button(frame_btn, text="换一段文本", command=self.new_text).grid(row=0, column=1, padx=10)

    def new_text(self):
        """随机获取新文本"""
        self.target_text = random.choice(TEXT_LIST)
        self.label_text.config(state=tk.NORMAL)
        self.label_text.delete(1.0, tk.END)
        self.label_text.insert(1.0, self.target_text)
        self.label_text.config(state=tk.DISABLED)
        self.reset()

    def reset(self):
        """重置所有数据"""
        self.input_box.delete(1.0, tk.END)
        self.start_time = None
        self.is_running = False
        self.correct_count = 0
        self.total_input = 0
        self.label_speed.config(text="速度：0 WPM")
        self.label_acc.config(text="正确率：0%")
        self.label_time.config(text="用时：0s")

    def check_input(self, event):
        """按键松开实时检测输入"""
        content = self.input_box.get(1.0, tk.END).strip("\n")

        # 第一次输入启动计时
        if not self.is_running and len(content) > 0:
            self.start_time = time.time()
            self.is_running = True

        if not self.is_running or self.start_time is None:
            return

        used_time = time.time() - self.start_time
        self.label_time.config(text=f"用时：{used_time:.1f}s")

        # 对比字符
        self.correct_count = 0
        min_len = min(len(content), len(self.target_text))
        for i in range(min_len):
            if content[i] == self.target_text[i]:
                self.correct_count += 1
        self.total_input = len(content)

        # 计算正确率
        if self.total_input > 0:
            accuracy = self.correct_count / self.total_input * 100
        else:
            accuracy = 0
        self.label_acc.config(text=f"正确率：{accuracy:.1f}%")

        # WPM 英文打字速度（字符换算）
        wpm = (self.correct_count / 5) / (used_time / 60) if used_time > 0 else 0
        self.label_speed.config(text=f"速度：{wpm:.1f} WPM")

if __name__ == "__main__":
    window = tk.Tk()
    app = TypePracticeApp(window)
    window.mainloop()