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

# 练习文本库，可以自行增加段落
text_library = [
    "人生如逆旅，我亦是行人。不要害怕前路漫长，坚持下去终会抵达想去的远方。",
    "计算机科学不只是敲代码，更是逻辑思维，学会拆解问题，才能高效解决难题。",
    "白日依山尽，黄河入海流。欲穷千里目，更上一层楼。",
    "落霞与孤鹜齐飞，秋水共长天一色。渔舟唱晚，响穷彭蠡之滨。",
    "Practice makes perfect. Never give up when you encounter difficulties.",
    "书山有路勤为径，学海无涯苦作舟。努力不一定立刻有回报，但长期一定见效。",
    "春风又绿江南岸，明月何时照我还。时光匆匆，珍惜当下每一分每一秒。",
    "The only way to do great work is to love what you do."
]

class TypingApp:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习工具")
        self.root.geometry("820x520")
        self.root.resizable(False, False)

        # 状态变量
        self.start_time = None
        self.running = False
        self.target_text = ""
        self.input_text = ""

        # 顶部信息栏
        frame_top = ttk.Frame(root, padding=10)
        frame_top.pack(fill=tk.X)

        self.label_time = ttk.Label(frame_top, text="用时：0 秒", font=("微软雅黑",11))
        self.label_time.pack(side=tk.LEFT, padx=10)

        self.label_speed = ttk.Label(frame_top, text="速度：0 WPM", font=("微软雅黑",11))
        self.label_speed.pack(side=tk.LEFT, padx=10)

        self.label_accuracy = ttk.Label(frame_top, text="正确率：0%", font=("微软雅黑",11))
        self.label_accuracy.pack(side=tk.LEFT, padx=10)

        # 按钮区域
        frame_btn = ttk.Frame(root, padding=(10,0))
        frame_btn.pack(fill=tk.X)
        self.btn_start = ttk.Button(frame_btn, text="开始练习", command=self.start_game)
        self.btn_start.pack(side=tk.LEFT)
        self.btn_reset = ttk.Button(frame_btn, text="重置", command=self.reset_all)
        self.btn_reset.pack(side=tk.LEFT, padx=8)

        # 范文展示区域
        ttk.Label(root, text="【待输入文本】", padding=(10,8,10,0)).pack(anchor="w")
        self.text_target = tk.Text(root, height=4, font=("微软雅黑",13), wrap=tk.WORD)
        self.text_target.pack(padx=10, fill=tk.X)
        self.text_target.config(state=tk.DISABLED)

        # 输入提示标签
        ttk.Label(root, text="【在此输入】", padding=(10,8,10,0)).pack(anchor="w")
        self.entry_input = tk.Text(root, height=6, font=("微软雅黑",13), wrap=tk.WORD)
        self.entry_input.pack(padx=10, fill=tk.X)
        self.entry_input.bind("<KeyRelease>", self.on_type)

        # 实时刷新计时器
        self.update_timer()

    def start_game(self):
        # 随机选取文本
        self.target_text = random.choice(text_library)
        self.input_text = ""
        self.running = True
        self.start_time = time.time()

        # 显示范文
        self.text_target.config(state=tk.NORMAL)
        self.text_target.delete(1.0, tk.END)
        self.text_target.insert(tk.END, self.target_text)
        self.text_target.config(state=tk.DISABLED)

        self.entry_input.delete(1.0, tk.END)
        self.entry_input.focus()

    def reset_all(self):
        self.running = False
        self.start_time = None
        self.input_text = ""
        self.target_text = ""

        self.text_target.config(state=tk.NORMAL)
        self.text_target.delete(1.0, tk.END)
        self.text_target.config(state=tk.DISABLED)
        self.entry_input.delete(1.0, tk.END)

        self.label_time.config(text="用时：0 秒")
        self.label_speed.config(text="速度：0 WPM")
        self.label_accuracy.config(text="正确率：0%")

    def on_type(self, event):
        if not self.running:
            return
        self.input_text = self.entry_input.get(1.0, tk.END).strip("\n")
        self.calc_stat()

    def calc_stat(self):
        length_input = len(self.input_text)
        length_target = len(self.target_text)
        if length_input == 0:
            return

        # 比对字符
        correct = 0
        for i in range(length_input):
            if i >= length_target:
                break
            if self.input_text[i] == self.target_text[i]:
                correct += 1

        # 正确率
        accuracy = correct / length_input if length_input > 0 else 0
        self.label_accuracy.config(text=f"正确率：{accuracy*100:.1f}%")

        # 打字速度 WPM (英文标准，中文可看作字符/分钟)
        cost_time = time.time() - self.start_time
        if cost_time > 0:
            wpm = (length_input / cost_time) * 60
            self.label_speed.config(text=f"速度：{wpm:.1f} CPM")

        # 判断是否输入完成
        if self.input_text == self.target_text:
            self.running = False

    def update_timer(self):
        if self.running and self.start_time is not None:
            sec = int(time.time() - self.start_time)
            self.label_time.config(text=f"用时：{sec} 秒")
        self.root.after(200, self.update_timer)

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