import tkinter as tk
from tkinter import ttk, messagebox
import time
import random

# 练习文本库（可自行添加）
TEXT_POOL = [
    "Python是一种解释型、高级编程语言，语法简洁清晰，适合初学者学习。",
    "坚持每天练习打字，可以有效提升输入速度和工作效率。",
    "学习编程需要耐心和坚持，不断练习才能掌握更多知识。",
    "春风拂过大地，万物复苏，花儿盛开，鸟儿在枝头欢快歌唱。",
    "科技改变生活，人工智能正在走进千家万户，带来无限可能。",
    "保持专注，认真练习，每一次努力都会成为进步的阶梯。",
    "阅读能丰富思想，写作能表达内心，打字则是连接两者的桥梁。"
]


class TypingPractice:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习软件 V1.0")
        self.root.geometry("750x500")
        self.root.resizable(False, False)

        # 变量初始化
        self.start_time = 0
        self.is_typing = False
        self.current_text = ""

        # 创建界面
        self.create_widgets()

    def create_widgets(self):
        # 顶部标题
        title_label = ttk.Label(
            self.root,
            text="打字练习软件",
            font=("微软雅黑", 20, "bold")
        )
        title_label.pack(pady=10)

        # 统计面板
        self.stats_frame = ttk.Frame(self.root)
        self.stats_frame.pack(fill=tk.X, padx=20, pady=5)

        self.time_label = ttk.Label(
            self.stats_frame, text="时间：00:00", font=("微软雅黑", 12))
        self.time_label.grid(row=0, column=0, padx=10)

        self.speed_label = ttk.Label(
            self.stats_frame, text="速度：0 字/分钟", font=("微软雅黑", 12))
        self.speed_label.grid(row=0, column=1, padx=10)

        self.accuracy_label = ttk.Label(
            self.stats_frame, text="正确率：100%", font=("微软雅黑", 12))
        self.accuracy_label.grid(row=0, column=2, padx=10)

        self.error_label = ttk.Label(
            self.stats_frame, text="错误：0 个", font=("微软雅黑", 12))
        self.error_label.grid(row=0, column=3, padx=10)

        # 待输入文本区域
        ttk.Label(self.root, text="练习文本", font=(
            "微软雅黑", 12, "bold")).pack(anchor=tk.W, padx=20)
        self.text_display = tk.Text(
            self.root,
            height=4,
            font=("微软雅黑", 14),
            wrap=tk.WORD,
            relief=tk.GROOVE,
            bd=2
        )
        self.text_display.pack(fill=tk.X, padx=20, pady=5)
        self.text_display.config(state=tk.DISABLED)

        # 输入区域
        ttk.Label(self.root, text="输入区域", font=(
            "微软雅黑", 12, "bold")).pack(anchor=tk.W, padx=20)
        self.input_text = tk.Text(
            self.root,
            height=6,
            font=("微软雅黑", 14),
            wrap=tk.WORD,
            relief=tk.GROOVE,
            bd=2
        )
        self.input_text.pack(fill=tk.X, padx=20, pady=5)
        self.input_text.bind("<KeyRelease>", self.check_input)
        self.input_text.config(state=tk.DISABLED)

        # 按钮区域
        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, state=tk.DISABLED)
        self.reset_btn.grid(row=0, column=1, padx=15)

        ttk.Button(btn_frame, text="退出", command=self.root.quit).grid(
            row=0, column=2, padx=15)

    def get_random_text(self):
        """随机获取练习文本"""
        return random.choice(TEXT_POOL)

    def start_practice(self):
        """开始练习"""
        self.current_text = self.get_random_text()
        self.start_time = time.time()
        self.is_typing = True

        # 清空并显示文本
        self.text_display.config(state=tk.NORMAL)
        self.text_display.delete(1.0, tk.END)
        self.text_display.insert(tk.END, self.current_text)
        self.text_display.config(state=tk.DISABLED)

        # 启用输入
        self.input_text.config(state=tk.NORMAL)
        self.input_text.delete(1.0, tk.END)
        self.input_text.focus()

        # 按钮状态
        self.start_btn.config(state=tk.DISABLED)
        self.reset_btn.config(state=tk.NORMAL)

        # 启动计时器
        self.update_timer()

    def check_input(self, event):
        """实时检查输入内容"""
        if not self.is_typing:
            return

        user_input = self.input_text.get(1.0, tk.END).strip()
        original = self.current_text.strip()
        correct_chars = 0
        errors = 0

        # 计算正确字符和错误数
        for i, char in enumerate(user_input):
            if i < len(original) and char == original[i]:
                correct_chars += 1
            else:
                errors += 1

        # 计算正确率
        total = len(user_input)
        accuracy = (correct_chars / total * 100) if total > 0 else 100

        # 计算用时和速度
        elapsed = time.time() - self.start_time
        speed = int((correct_chars / elapsed) * 60) if elapsed > 0 else 0

        # 更新界面显示
        self.speed_label.config(text=f"速度：{speed} 字/分钟")
        self.accuracy_label.config(text=f"正确率：{accuracy:.1f}%")
        self.error_label.config(text=f"错误：{errors} 个")

        # 完成练习
        if user_input == original:
            self.is_typing = False
            self.input_text.config(state=tk.DISABLED)
            messagebox.showinfo(
                "练习完成",
                f"恭喜你完成练习！\n\n用时：{elapsed:.1f} 秒\n速度：{speed} 字/分钟\n正确率：{accuracy:.1f}%"
            )

    def update_timer(self):
        """更新计时"""
        if self.is_typing:
            elapsed = int(time.time() - self.start_time)
            minutes = elapsed // 60
            seconds = elapsed % 60
            self.time_label.config(text=f"时间：{minutes:02d}:{seconds:02d}")
            self.root.after(1000, self.update_timer)

    def reset_practice(self):
        """重置练习"""
        self.is_typing = False
        self.start_time = 0

        # 清空界面
        self.text_display.config(state=tk.NORMAL)
        self.text_display.delete(1.0, tk.END)
        self.text_display.config(state=tk.DISABLED)

        self.input_text.delete(1.0, tk.END)
        self.input_text.config(state=tk.DISABLED)

        # 重置统计
        self.time_label.config(text="时间：00:00")
        self.speed_label.config(text="速度：0 字/分钟")
        self.accuracy_label.config(text="正确率：100%")
        self.error_label.config(text="错误：0 个")

        # 按钮状态
        self.start_btn.config(state=tk.NORMAL)
        self.reset_btn.config(state=tk.DISABLED)


if __name__ == "__main__":
    root = tk.Tk()
    app = TypingPractice(root)
    root.mainloop()
