Typing Speed Visualizer – Real-Time Python App with Live WPM Graph | FuzzuTech

 Demo :


Click Video πŸ‘‡πŸ‘‡πŸ‘‡















Code :


import tkinter as tk

from tkinter import ttk

import time

import threading

import matplotlib.pyplot as plt

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg


class TypingVisualizer:

    def __init__(self):

        self.root = tk.Tk()

        self.root.title("Typing Speed Visualizer - FuzzuTech")

        self.root.geometry("650x700")

        self.root.config(bg="#0f172a")


        self.text_input = tk.Text(self.root, height=10, font=("Consolas", 14), bg="#1e293b", fg="white", insertbackground="white")

        self.text_input.pack(padx=20, pady=(30, 10), fill=tk.X)


        self.stats_label = tk.Label(self.root, text="WPM: 0 | Accuracy: 100%", font=("Arial", 12), fg="white", bg="#0f172a")

        self.stats_label.pack()


        self.fig, self.ax = plt.subplots(figsize=(6, 3), dpi=100)

        self.ax.set_title("Typing Speed Over Time (WPM)")

        self.ax.set_xlabel("Time (s)")

        self.ax.set_ylabel("WPM")

        self.line, = self.ax.plot([], [], color='cyan', marker='o')

        self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)

        self.canvas.get_tk_widget().pack(pady=10)


        self.wpm_data = []

        self.time_data = []

        self.start_time = None

        self.typed_chars = 0

        self.correct_chars = 0


        self.text_input.bind("<KeyPress>", self.track_typing)


    def track_typing(self, event):

        if not self.start_time:

            self.start_time = time.time()

            threading.Thread(target=self.update_graph, daemon=True).start()


        if event.keysym == "BackSpace":

            self.typed_chars = max(0, self.typed_chars - 1)

        elif len(event.char) == 1:

            self.typed_chars += 1

            self.correct_chars += 1  # Optional: Compare with reference text


        elapsed = time.time() - self.start_time

        wpm = (self.typed_chars / 5) / (elapsed / 60) if elapsed > 0 else 0

        accuracy = (self.correct_chars / self.typed_chars * 100) if self.typed_chars > 0 else 100


        self.stats_label.config(text=f"WPM: {int(wpm)} | Accuracy: {int(accuracy)}%")


    def update_graph(self):

        while True:

            time.sleep(2)

            if not self.start_time:

                continue

            elapsed = int(time.time() - self.start_time)

            wpm = (self.typed_chars / 5) / (elapsed / 60) if elapsed > 0 else 0


            self.time_data.append(elapsed)

            self.wpm_data.append(wpm)

            self.line.set_data(self.time_data, self.wpm_data)

            self.ax.relim()

            self.ax.autoscale_view()

            self.canvas.draw()


    def run(self):

        self.root.mainloop()


if __name__ == "__main__":

    app = TypingVisualizer()

    app.run()

Comments

Popular posts from this blog

πŸš€ Simple Login & Registration System in Python Tkinter πŸ“±

πŸ”₯ Advanced MP3 Music Player in Python | CustomTkinter + Pygame | Free Source Code

πŸš€ Create a Python Screen Recorder with Audio (Complete Code)