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

# 练习文本库（可自行添加更多内容）
TEXT_POOL = [
    "Python是一种解释型、高级编程语言，语法简洁易懂，适合初学者快速入门。",
    "坚持每天练习打字，不仅能提升速度，还能提高工作和学习效率。",
    "用心感受每一个按键，专注当下，你会发现打字变得越来越轻松。",
    "生活就像一面镜子，你对它微笑，它便会对你微笑。",
    "学习编程需要耐心和坚持，每一行代码都是成长的足迹。",
    "保持热爱，奔赴山海，平凡的日子也会闪闪发光。"
]

class TypingTrainer:
    def __init__(self, root):
        # 主窗口设置
        self.root = root
        self.root.title("Python 打字练习工具")
        self.root.geometry("750x450")  # 窗口大小
        self.root.resizable(False, False)  # 禁止缩放

        # 全局变量
        self.target_text = ""  # 目标文本
        self.start_time = 0    # 开始时间
        self.is_typing = False # 是否开始打字

        # 初始化界面
        self.setup_ui()

    def setup_ui(self):
        """创建所有界面组件"""
        # 标题标签
        title_label = ttk.Label(self.root, text="打字练习", font=("微软雅黑", 20, "bold"))
        title_label.pack(pady=10)

        # 目标文本展示框
        self.text_label = tk.Text(self.root, height=4, width=60, font=("微软雅黑", 14), state=tk.DISABLED)
        self.text_label.pack(pady=10)

        # 输入框
        self.input_entry = tk.Text(self.root, height=4, width=60, font=("微软雅黑", 14))
        self.input_entry.pack(pady=10)
        # 绑定输入事件：开始打字时启动计时
        self.input_entry.bind("<KeyPress>", self.start_timer)

        # 统计信息区域
        self.info_frame = ttk.Frame(self.root)
        self.info_frame.pack(pady=10)

        self.time_label = ttk.Label(self.info_frame, text="用时：0秒", font=("微软雅黑", 12))
        self.time_label.grid(row=0, column=0, padx=20)

        self.speed_label = ttk.Label(self.info_frame, text="速度：0字/分钟", font=("微软雅黑", 12))
        self.speed_label.grid(row=0, column=1, padx=20)

        self.accuracy_label = ttk.Label(self.info_frame, text="正确率：0%", font=("微软雅黑", 12))
        self.accuracy_label.grid(row=0, column=2, padx=20)

        # 按钮区域
        btn_frame = ttk.Frame(self.root)
        btn_frame.pack(pady=15)

        self.start_btn = ttk.Button(btn_frame, text="开始练习", command=self.start_practice)
        self.start_btn.grid(row=0, column=0, padx=15)

        self.reset_btn = ttk.Button(btn_frame, text="重置", command=self.reset_practice)
        self.reset_btn.grid(row=0, column=1, padx=15)

    def start_practice(self):
        """开始练习：随机选择文本，清空输入框"""
        self.reset_practice()  # 先重置状态
        self.target_text = random.choice(TEXT_POOL)
        # 显示目标文本
        self.text_label.config(state=tk.NORMAL)
        self.text_label.delete(1.0, tk.END)
        self.text_label.insert(tk.END, self.target_text)
        self.text_label.config(state=tk.DISABLED)
        # 聚焦输入框
        self.input_entry.focus()

    def start_timer(self, event):
        """第一次按键时启动计时"""
        if not self.is_typing:
            self.is_typing = True
            self.start_time = time.time()
            # 实时计算结果
            self.calculate_result()

    def calculate_result(self):
        """实时计算用时、速度、正确率"""
        if not self.is_typing:
            return

        # 计算用时
        used_time = int(time.time() - self.start_time)
        self.time_label.config(text=f"用时：{used_time}秒")

        # 获取用户输入的文本
        user_input = self.input_entry.get(1.0, tk.END).strip()
        target_len = len(self.target_text)
        input_len = len(user_input)

        if input_len == 0:
            self.speed_label.config(text="速度：0字/分钟")
            self.accuracy_label.config(text="正确率：0%")
            self.root.after(100, self.calculate_result)
            return

        # 计算正确率
        correct_count = 0
        for i in range(min(input_len, target_len)):
            if user_input[i] == self.target_text[i]:
                correct_count += 1
        accuracy = (correct_count / target_len) * 100
        self.accuracy_label.config(text=f"正确率：{accuracy:.1f}%")

        # 计算速度（字/分钟）
        if used_time > 0:
            speed = (input_len / used_time) * 60
            self.speed_label.config(text=f"速度：{int(speed)}字/分钟")

        # 完成练习判断
        if user_input == self.target_text:
            self.is_typing = False
            messagebox.showinfo("完成", f"恭喜你完成练习！\n用时：{used_time}秒\n速度：{int(speed)}字/分钟\n正确率：{accuracy:.1f}%")

        # 每100毫秒刷新一次
        self.root.after(100, self.calculate_result)

    def reset_practice(self):
        """重置练习状态"""
        self.is_typing = False
        self.start_time = 0
        self.target_text = ""

        # 清空界面
        self.text_label.config(state=tk.NORMAL)
        self.text_label.delete(1.0, tk.END)
        self.text_label.config(state=tk.DISABLED)

        self.input_entry.delete(1.0, tk.END)
        self.time_label.config(text="用时：0秒")
        self.speed_label.config(text="速度：0字/分钟")
        self.accuracy_label.config(text="正确率：0%")

if __name__ == "__main__":
    main_root = tk.Tk()
    app = TypingTrainer(main_root)
    main_root.mainloop()