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

# 练习文本库
text_list = [
    "清晨的阳光穿过树梢，微风轻轻吹动路边的野草。",
    "人生就像一场漫长旅途，不必急于抵达终点。",
    "读书使人充实，思考使人深邃，交谈使人清醒。",
    "落日沉入远山，晚风携带着夏夜独有的清凉。",
    "坚持平凡小事，日积月累便可以收获巨大改变。"
]


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

        # 变量
        self.start_time = None
        self.is_start = False
        self.now_text = ""

        # 标题
        ttk.Label(root, text="Python 打字练习工具", font=("微软雅黑", 18)).pack(pady=10)

        # 目标文字区域
        ttk.Label(root, text="对照文本：", font=("微软雅黑", 11)).pack()
        self.label_target = tk.Text(root, height=4, width=80, font=("微软雅黑", 12))
        self.label_target.pack(pady=5)

        # 输入框
        ttk.Label(root, text="在此输入：", font=("微软雅黑", 11)).pack()
        self.input_box = tk.Text(root, height=6, width=80, font=("微软雅黑", 12))
        self.input_box.pack(pady=5)

        # 状态栏
        self.status_text = tk.StringVar(value="请点击【开始练习】")
        status_bar = ttk.Label(root, textvariable=self.status_text, font=("微软雅黑",10))
        status_bar.pack(pady=3)

        # 按钮容器
        frame_btn = ttk.Frame(root)
        frame_btn.pack(pady=8)

        self.btn_start = ttk.Button(frame_btn, text="开始练习", command=self.start_game)
        self.btn_start.grid(row=0, column=0, padx=6)

        self.btn_reset = ttk.Button(frame_btn, text="重置", command=self.reset_all)
        self.btn_reset.grid(row=0, column=1, padx=6)

        self.btn_check = ttk.Button(frame_btn, text="查看成绩", command=self.calc_result)
        self.btn_check.grid(row=0, column=2, padx=6)

        self.get_new_text()

    def get_new_text(self):
        """获取随机练习文字"""
        self.now_text = random.choice(text_list)
        self.label_target.delete(1.0, tk.END)
        self.label_target.insert(tk.END, self.now_text)

    def start_game(self):
        if self.is_start:
            return
        self.start_time = time.time()
        self.is_start = True
        self.status_text.set("已经开始，请尽快输入上方文字！")
        self.input_box.delete(1.0, tk.END)

    def reset_all(self):
        self.is_start = False
        self.start_time = None
        self.get_new_text()
        self.input_box.delete(1.0, tk.END)
        self.status_text.set("已重置，请点击【开始练习】")

    def calc_result(self):
        if not self.is_start or self.start_time is None:
            messagebox.showwarning("警告", "请先点击开始并且完成打字！")
            return
        end_time = time.time()
        cost = end_time - self.start_time
        user_input = self.input_box.get(1.0, tk.END).strip()
        target = self.now_text

        # 计算正确字符
        right = 0
        min_len = min(len(user_input), len(target))
        for i in range(min_len):
            if user_input[i] == target[i]:
                right += 1

        all_len = len(target)
        accuracy = round((right / all_len)*100,2)
        speed = round(len(user_input)/(cost/60),2)

        info = f"""用时：{round(cost,2)} s
打字速度：{speed} 字/分钟
正确字符：{right}/{all_len}
正确率：{accuracy} %"""
        messagebox.showinfo("本次练习成绩", info)
        self.status_text.set("查看完毕，可以重置新一轮练习")
        self.is_start = False


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