import tkinter as tk
from tkinter import ttk, messagebox
import random
import time

# 预设的练习文本库
TEXT_POOL = [
    "Python是一种解释型、高级编程语言，简洁易读，广泛用于数据分析、人工智能和Web开发。",
    "坚持练习打字可以大幅提升工作效率，正确的指法和专注度是快速打字的关键。",
    "生活就像骑自行车，要保持平衡就得不断前进，困难总会在努力后变成成长的礼物。",
    "学习编程需要耐心和实践，每一行代码都是通往技术高手之路的坚实脚步。",
    "春风拂过大地，万物复苏，花儿绽放，鸟儿歌唱，处处充满生机与希望。",
    "科技改变生活，创新驱动未来，用代码构建梦想，用智慧创造价值。"
]

class TypingTrainer:
    def __init__(self, root):
        # 主窗口设置
        self.root = root
        self.root.title("打字练习软件 v1.0")
        self.root.geometry("800x500")
        self.root.resizable(False, False)

        # 变量初始化
        self.current_text = ""  # 当前练习文本
        self.start_time = 0     # 开始时间
        self.is_typing = False  # 是否正在打字

        # 创建界面组件
        self.create_widgets()

    def create_widgets(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=70, 
            font=("微软雅黑", 14),
            state=tk.DISABLED,
            bg="#f0f0f0"
        )
        self.text_label.pack(pady=10)

        # 按钮框架
        btn_frame = ttk.Frame(self.root)
        btn_frame.pack(pady=5)

        self.start_btn = ttk.Button(
            btn_frame, 
            text="开始练习", 
            command=self.start_typing
        )
        self.start_btn.grid(row=0, column=0, padx=10)

        self.reset_btn = ttk.Button(
            btn_frame, 
            text="重新开始", 
            command=self.reset_typing,
            state=tk.DISABLED
        )
        self.reset_btn.grid(row=0, column=1, padx=10)

        # 输入框
        self.input_entry = tk.Text(
            self.root, 
            height=8, 
            width=70, 
            font=("微软雅黑", 14),
            state=tk.DISABLED
        )
        self.input_entry.pack(pady=10)
        # 绑定输入事件，实时检测
        self.input_entry.bind("<KeyRelease>", self.check_text)

        # 统计信息框架
        stat_frame = ttk.LabelFrame(self.root, text="打字统计", padding=10)
        stat_frame.pack(pady=10, fill=tk.X, padx=20)

        # 统计标签
        self.time_label = ttk.Label(stat_frame, text="用时：0秒", font=("微软雅黑", 12))
        self.time_label.grid(row=0, column=0, padx=15)

        self.speed_label = ttk.Label(stat_frame, text="速度：0字/分钟", font=("微软雅黑", 12))
        self.speed_label.grid(row=0, column=1, padx=15)

        self.correct_label = ttk.Label(stat_frame, text="正确率：0%", font=("微软雅黑", 12))
        self.correct_label.grid(row=0, column=2, padx=15)

        self.error_label = ttk.Label(stat_frame, text="错误数：0", font=("微软雅黑", 12))
        self.error_label.grid(row=0, column=3, padx=15)

    def get_random_text(self):
        """随机获取练习文本"""
        return random.choice(TEXT_POOL)

    def start_typing(self):
        """开始练习"""
        self.current_text = self.get_random_text()
        # 显示待输入文本
        self.text_label.config(state=tk.NORMAL)
        self.text_label.delete(1.0, tk.END)
        self.text_label.insert(tk.END, self.current_text)
        self.text_label.config(state=tk.DISABLED)

        # 重置输入框和统计
        self.input_entry.config(state=tk.NORMAL)
        self.input_entry.delete(1.0, tk.END)
        self.input_entry.focus()  # 聚焦输入框

        # 重置状态
        self.start_time = time.time()
        self.is_typing = True
        self.start_btn.config(state=tk.DISABLED)
        self.reset_btn.config(state=tk.NORMAL)

        # 重置统计显示
        self.time_label.config(text="用时：0秒")
        self.speed_label.config(text="速度：0字/分钟")
        self.correct_label.config(text="正确率：0%")
        self.error_label.config(text="错误数：0")

    def reset_typing(self):
        """重置练习"""
        self.is_typing = False
        self.input_entry.config(state=tk.DISABLED)
        self.start_btn.config(state=tk.NORMAL)
        self.reset_btn.config(state=tk.DISABLED)
        # 清空文本
        self.text_label.config(state=tk.NORMAL)
        self.text_label.delete(1.0, tk.END)
        self.text_label.config(state=tk.DISABLED)

    def check_text(self, event):
        """实时检测输入内容并统计数据"""
        if not self.is_typing:
            return

        # 获取输入内容
        user_input = self.input_entry.get(1.0, tk.END).strip()
        total_chars = len(self.current_text)
        input_chars = len(user_input)

        # 计算错误数
        error_count = 0
        correct_chars = 0
        for i, c in enumerate(user_input):
            if i < total_chars and c == self.current_text[i]:
                correct_chars += 1
            else:
                error_count += 1

        # 计算用时
        used_time = max(time.time() - self.start_time, 1)  # 最小1秒，避免除零
        minutes = used_time / 60
        # 速度：正确字数 / 分钟
        speed = int(correct_chars / minutes) if minutes > 0 else 0
        # 正确率
        correct_rate = int((correct_chars / total_chars) * 100) if total_chars > 0 else 0

        # 更新统计信息
        self.time_label.config(text=f"用时：{int(used_time)}秒")
        self.speed_label.config(text=f"速度：{speed}字/分钟")
        self.correct_label.config(text=f"正确率：{correct_rate}%")
        self.error_label.config(text=f"错误数：{error_count}")

        # 输入完成，结束练习
        if user_input == self.current_text:
            self.is_typing = False
            self.input_entry.config(state=tk.DISABLED)
            messagebox.showinfo(
                "练习完成",
                f"恭喜你完成练习！\n用时：{int(used_time)}秒\n速度：{speed}字/分钟\n正确率：{correct_rate}%"
            )
            self.start_btn.config(state=tk.NORMAL)
            self.reset_btn.config(state=tk.DISABLED)

# 运行程序
if __name__ == "__main__":
    window = tk.Tk()
    app = TypingTrainer(window)
    window.mainloop()