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

# 练习文本库
text_lib = [
    "the quick brown fox jumps over the lazy dog",
    "python is a simple and powerful programming language",
    "life is short you need python",
    "hello world welcome to typing practice",
    "today we learn how to write good code",
    "实践是检验真理的唯一标准",
    "编程要多动手敲代码才能进步",
    "一寸光阴一寸金寸金难买寸光阴"
]

class TypingPractice:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习软件")
        self.root.geometry("650x420")

        self.start_time = None
        self.is_start = False
        self.target_text = ""

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

        # 目标文本显示区域
        frame_target = ttk.LabelFrame(root, text="需要输入的文本")
        frame_target.pack(fill="x", padx=15, pady=5)
        self.label_target = ttk.Label(frame_target, text="点击【开始练习】", font=("微软雅黑",13),wraplength=600)
        self.label_target.pack(pady=10)

        # 用户输入框
        frame_input = ttk.LabelFrame(root, text="在此输入")
        frame_input.pack(fill="x", padx=15, pady=5)
        self.input_var = tk.StringVar()
        self.entry_input = ttk.Entry(frame_input, textvariable=self.input_var, font=("微软雅黑",13))
        self.entry_input.pack(fill="x", padx=8, pady=8)
        self.entry_input.config(state="disabled")

        # 结果统计
        frame_stat = ttk.Frame(root)
        frame_stat.pack(pady=8)
        self.label_time = ttk.Label(frame_stat, text="用时：0 s", font=("微软雅黑",11))
        self.label_time.grid(row=0, column=0, padx=15)
        self.label_speed = ttk.Label(frame_stat, text="速度：0 字/秒", font=("微软雅黑",11))
        self.label_speed.grid(row=0, column=1, padx=15)
        self.label_right = ttk.Label(frame_stat, text="正确率：0%", font=("微软雅黑",11))
        self.label_right.grid(row=0, column=2, padx=15)

        # 按钮
        frame_btn = ttk.Frame(root)
        frame_btn.pack(pady=10)
        self.btn_start = ttk.Button(frame_btn, text="开始练习", command=self.start_practice)
        self.btn_start.grid(row=0, column=0, padx=8)
        self.btn_end = ttk.Button(frame_btn, text="结束统计", command=self.end_practice)
        self.btn_end.grid(row=0, column=1, padx=8)

    def start_practice(self):
        """开始练习，随机取文本，开启输入框，记录开始时间"""
        self.target_text = random.choice(text_lib)
        self.label_target.config(text=self.target_text)
        self.input_var.set("")
        self.entry_input.config(state="normal")
        self.entry_input.focus()
        self.start_time = time.time()
        self.is_start = True

    def end_practice(self):
        """结束，计算用时、正确率、打字速度"""
        if not self.is_start:
            return
        end_time = time.time()
        use_time = end_time - self.start_time
        user_input = self.input_var.get()

        # 计算正确字符数量
        correct = 0
        min_len = min(len(user_input), len(self.target_text))
        for i in range(min_len):
            if user_input[i] == self.target_text[i]:
                correct +=1

        total_len = len(self.target_text)
        if total_len ==0:
            accuracy = 0
        else:
            accuracy = (correct / total_len)*100
        speed = len(user_input)/use_time if use_time>0 else 0

        # 更新界面数据
        self.label_time.config(text=f"用时：{use_time:.1f} s")
        self.label_speed.config(text=f"速度：{speed:.2f} 字/秒")
        self.label_right.config(text=f"正确率：{accuracy:.1f} %")

        self.entry_input.config(state="disabled")
        self.is_start = False


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