import tkinter as tk
from tkinter import ttk
import random
import time

# 打字题库
word_list = [
    "python code game design",
    "hello world program",
    "data structure algorithm",
    "computer science study",
    "math formula calculate",
    "keep practice everyday",
    "dream big work hard",
    "artificial intelligence",
    "software development",
    "keyboard typing test"
]


class TypePracticeApp:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习软件")
        self.root.geometry("800x500")
        self.root.resizable(False, False)

        # 变量
        self.start_time = None
        self.is_start = False
        self.target_text = ""

        # 标题 【已修复：去掉emoji + 通用字体】
        title_label = tk.Label(root, text="打字练习", font=("Arial", 20, "bold"))
        title_label.pack(pady=10)

        # 目标文本展示
        tk.Label(root, text="目标内容：", font=(
            "Arial", 12)).pack(anchor="w", padx=30)
        self.target_label = tk.Label(root, text="点击开始练习", font=("Arial", 14),
                                     bg="#f5f5f5", width=60, height=3, wraplength=700)
        self.target_label.pack(pady=5)

        # 输入框
        tk.Label(root, text="请在此输入：", font=(
            "Arial", 12)).pack(anchor="w", padx=30)
        self.input_entry = tk.Text(
            root, font=("Arial", 14), width=60, height=4)
        self.input_entry.pack(pady=5)
        self.input_entry.bind("<KeyRelease>", self.check_input)

        # 数据统计栏
        frame_info = tk.Frame(root)
        frame_info.pack(pady=10)

        self.time_label = tk.Label(
            frame_info, text="用时：0s", font=("Arial", 12), width=12)
        self.time_label.grid(row=0, column=0, padx=10)

        self.speed_label = tk.Label(
            frame_info, text="速度：0 字/分", font=("Arial", 12), width=15)
        self.speed_label.grid(row=0, column=1, padx=10)

        self.acc_label = tk.Label(
            frame_info, text="正确率：0%", font=("Arial", 12), width=12)
        self.acc_label.grid(row=0, column=2, padx=10)

        # 按钮区
        frame_btn = tk.Frame(root)
        frame_btn.pack(pady=5)

        ttk.Button(frame_btn, text="开始练习", command=self.start_practice).grid(
            row=0, column=0, padx=8)
        ttk.Button(frame_btn, text="下一题", command=self.next_text).grid(
            row=0, column=1, padx=8)
        ttk.Button(frame_btn, text="清空输入", command=self.clear_input).grid(
            row=0, column=2, padx=8)
        ttk.Button(frame_btn, text="重置统计", command=self.reset_data).grid(
            row=0, column=3, padx=8)

    # 随机获取文本
    def get_random_text(self):
        return random.choice(word_list)

    # 开始练习
    def start_practice(self):
        self.target_text = self.get_random_text()
        self.target_label.config(text=self.target_text, fg="#333333")
        self.start_time = time.time()
        self.is_start = True
        self.clear_input()

    # 下一题
    def next_text(self):
        self.start_practice()
        self.reset_data()

    # 实时检测输入
    def check_input(self, event):
        if not self.is_start:
            return
        user_text = self.input_entry.get("1.0", tk.END).strip()
        target = self.target_text.strip()

        # 计算用时
        use_time = round(time.time() - self.start_time, 1)
        self.time_label.config(text=f"用时：{use_time}s")

        # 计算字数、正确率
        total_len = len(target)
        right_count = 0
        min_len = min(len(user_text), total_len)
        for i in range(min_len):
            if user_text[i] == target[i]:
                right_count += 1

        accuracy = 100 * right_count / total_len if total_len > 0 else 0
        speed = len(user_text) / use_time * 60 if use_time > 0 else 0

        self.acc_label.config(text=f"正确率：{accuracy:.1f}%")
        self.speed_label.config(text=f"速度：{speed:.1f} 字/分")

        # 全部输入完成提示
        if user_text == target:
            self.target_label.config(text="输入完成！可点击下一题", fg="#00aa00")

    # 清空输入框
    def clear_input(self):
        self.input_entry.delete("1.0", tk.END)

    # 重置数据
    def reset_data(self):
        self.time_label.config(text="用时：0s")
        self.speed_label.config(text="速度：0 字/分")
        self.acc_label.config(text="正确率：0%")
        self.is_start = False


if __name__ == "__main__":
    root = tk.Tk()
    app = TypePracticeApp(root)
    root.mainloop()
