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

# 练习文本库
text_list = [
    "清晨的阳光穿过树梢洒落在安静的林间小路",
    "生活总是充满惊喜只要你愿意勇敢向前出发",
    "编程能够锻炼逻辑思维坚持练习就可以不断进步",
    "晚风轻轻吹动窗台的窗帘城市慢慢坠入夜色当中",
    "书山有路勤为径学海无涯苦作舟",
    "春天花开夏日听雨秋天观叶冬日赏雪",
    "每一滴汗水都会化作日后属于你的荣光",
    "平静对待得失用心感受身边平凡美好的事物"
]


class TypingPractice:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习软件")
        self.root.geometry("750x450")
        self.root.resizable(False, False)
        self.root.configure(bg="#f0f4f8")

        # 变量初始化
        self.start_time = None
        self.is_start = False
        self.now_text = ""
        self.right_count = 0
        self.all_count = 0

        # 标题
        title = tk.Label(root, text="✨ 打字训练器", font=("微软雅黑", 20, "bold"), bg="#f0f4f8", fg="#2c3e50")
        title.pack(pady=12)

        # 计时速度面板
        self.info_frame = tk.Frame(root, bg="#f0f4f8")
        self.info_frame.pack()
        self.label_time = tk.Label(self.info_frame, text="用时：0 s", font=("微软雅黑", 12), bg="#f0f4f8")
        self.label_time.grid(row=0, column=0, padx=20)
        self.label_speed = tk.Label(self.info_frame, text="速度：0 字/分钟", font=("微软雅黑", 12), bg="#f0f4f8")
        self.label_speed.grid(row=0, column=1, padx=20)
        self.label_correct = tk.Label(self.info_frame, text="正确率：0 %", font=("微软雅黑", 12), bg="#f0f4f8")
        self.label_correct.grid(row=0, column=2, padx=20)

        # 展示原文文本框
        tk.Label(root, text="需要输入的文字：", font=("微软雅黑",11), bg="#f0f4f8").pack(anchor="w", padx=30)
        self.text_show = tk.Text(root, height=3, width=85, font=("微软雅黑",13), bg="#ffffff")
        self.text_show.pack(pady=5)

        # 用户输入区
        tk.Label(root, text="在此处开始打字：", font=("微软雅黑",11), bg="#f0f4f8").pack(anchor="w", padx=30)
        self.input_box = tk.Text(root, height=3, width=85, font=("微软雅黑",13))
        self.input_box.pack(pady=5)
        self.input_box.bind("<KeyRelease>", self.check_input)

        # 按钮区域
        self.btn_frame = tk.Frame(root, bg="#f0f4f8")
        self.btn_frame.pack(pady=10)
        self.btn_start = tk.Button(self.btn_frame, text="开始练习", command=self.start_game,
                                      font=("微软雅黑",12), bg="#3498db", fg="white", width=12)
        self.btn_start.grid(row=0, column=0, padx=10)
        self.btn_reset = tk.Button(self.btn_frame, text="重置", command=self.reset_game,
                                     font=("微软雅黑",12), bg="#e74c3c", fg="white", width=12)
        self.btn_reset.grid(row=0, column=1, padx=10)

        self.timer_id = None

    # 开启练习
    def start_game(self):
        self.now_text = random.choice(text_list)
        self.text_show.delete(1.0, tk.END)
        self.text_show.insert(tk.END, self.now_text)
        self.input_box.delete(1.0, tk.END)
        self.input_box.focus()
        self.start_time = time.time()
        self.is_start = True
        self.right_count = 0
        self.all_count = 0
        self.update_timer()

    # 计时器刷新
    def update_timer(self):
        if self.is_start:
            use_sec = time.time() - self.start_time
            self.label_time.config(text=f"用时：{round(use_sec,1)} s")
            self.timer_id = self.root.after(100, self.update_timer)

    # 实时校验输入文字对错
    def check_input(self, event):
        if not self.is_start:
            return
        user_str = self.input_box.get(1.0, tk.END).strip("\n")
        self.all_count = len(user_str)
        min_len = min(len(user_str), len(self.now_text))
        self.right_count = 0
        for i in range(min_len):
            if user_str[i] == self.now_text[i]:
                self.right_count += 1

        # 计算速度和正确率
        spend = time.time() - self.start_time
        if spend > 0:
            speed = (self.right_count / spend) * 60
        else:
            speed = 0
        self.label_speed.config(text=f"速度：{round(speed,1)} 字/分钟")
        if self.all_count > 0:
            rate = round((self.right_count / self.all_count) * 100, 1)
        else:
            rate = 0
        self.label_correct.config(text=f"正确率：{rate} %")

        # 文本全部输入完成结束本局
        if len(user_str) >= len(self.now_text):
            self.is_start = False
            self.root.after_cancel(self.timer_id)
            messagebox.showinfo("练习结束",
                                f"用时 {round(spend,1)} 秒\n打字速度 {round(speed,1)} 字每分钟\n正确率 {rate}%")

    # 重置全部状态
    def reset_game(self):
        self.is_start = False
        if self.timer_id is not None:
            self.root.after_cancel(self.timer_id)
        self.text_show.delete(1.0, tk.END)
        self.input_box.delete(1.0, tk.END)
        self.label_time.config(text="用时：0 s")
        self.label_speed.config(text="速度：0 字/分钟")
        self.label_correct.config(text="正确率：0 %")


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