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
Post a Comment