Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 70 additions & 4 deletions typing_speed_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,17 @@
"Artificial Intelligence: where innovation meets computation in the pursuit of a smarter tomorrow."
]

feature
TEST_DURATION = 60

class TypingSpeedTest:
def __init__(self, root):
self.root = root
self.root.title("Typing Speed Test")
self.root.geometry("600x560")
self.root.resizable(False, False)


QUOTE_API_URL = "http://api.quotable.io/random"

THEMES = {
Expand All @@ -35,13 +46,20 @@ def __init__(self):
self.geometry("700x550")
self.resizable(False, False)

main
self.start_time = None
self.current_sentence = ""
self.time_left = TEST_DURATION
self.timer_id = None

self.title_label = tk.Label(root, text="Typing Speed Test", font=("Helvetica", 18, "bold"))
self.title_label.pack(pady=10)

feature
self.timer_label = tk.Label(root, text=f"Time Left: {self.time_left}s", font=("Helvetica", 14, "bold"), fg="blue")

self.timer_label = tk.Label(root, text="⏱ Time: 00:00", font=("Helvetica", 14, "bold"), fg="blue")
main
self.timer_label.pack(pady=5)

self.instruction_label = tk.Label(root, text="Type the exact sentence below as fast as you can:", font=("Helvetica", 14))
Expand All @@ -64,11 +82,9 @@ def __init__(self):
self.timer_running = False
self.elapsed_seconds = 0
# --- BUTTON SECTION ---
# The Start/Restart Button
self.start_button = tk.Button(root, text="Start Test", font=("Helvetica", 14), command=self.start_test)
self.start_button.pack(pady=10)

# NEW: Dedicated Display Results Button
self.result_button = tk.Button(root, text="Display Results", font=("Helvetica", 14), command=self.check_result, state=tk.DISABLED)
self.result_button.pack(pady=10)

Expand Down Expand Up @@ -165,17 +181,42 @@ def __init__(self):
# START TEST
# ==============================
def start_test(self):
feature
if self.timer_id:
self.root.after_cancel(self.timer_id)


self.timer_running = False
self.elapsed_seconds = 0
self.timer_label.config(text="⏱ Time: 00:00")
main
self.result_label.config(text="")
self.error_feedback_label.config(text="")
self.current_sentence = random.choice(SENTENCES)
self.sentence_label.config(text=self.current_sentence)
self.input_textbox.delete("1.0", tk.END)
self.input_textbox.focus()
feature

self.time_left = TEST_DURATION
self.timer_label.config(text=f"Time Left: {self.time_left}s")
self.start_time = time.time()

self.start_button.config(text="Restart Test", state=tk.DISABLED)
self.result_button.config(state=tk.NORMAL)
self.update_timer()

def update_timer(self):
if self.time_left > 0:
self.time_left -= 1
self.timer_label.config(text=f"Time Left: {self.time_left}s")
self.timer_id = self.root.after(1000, self.update_timer)
else:
self.check_result(timeout=True)

self.start_button.config(text="Restart Test", state=tk.NORMAL)
self.result_button.config(state=tk.NORMAL) # Enable result button when test starts
main

def enable_button_after_typing(self, event=None):
self.start_button.config(state=tk.NORMAL)
Expand Down Expand Up @@ -249,6 +290,25 @@ def update_timer(self):
self.timer_label.configure(text=f"Time Remaining: {self.time_left}s")
self.after(1000, self.update_timer)
else:
feature
self.error_feedback_label.config(text="")

def check_result(self, event=None, timeout=False):
if not self.start_time:
messagebox.showwarning("Warning", "Click 'Start Test' first!")
return "break"

if self.timer_id:
self.root.after_cancel(self.timer_id)
self.timer_id = None

if timeout:
elapsed_time = TEST_DURATION # Fix: Use fixed duration for denominator if timer expires
else:
end_time = time.time()
elapsed_time = end_time - self.start_time


self.check_result()

# ==============================
Expand Down Expand Up @@ -299,6 +359,7 @@ def check_result(self, event=None):
self.pause_button.configure(state="disabled")

elapsed_time = (time.time() - self.start_time) - self.total_paused_time
main
typed_text = self.input_textbox.get("1.0", "end-1c")
if typed_text.strip() == self.current_sentence:
word_count = len(self.current_sentence.split())
Expand All @@ -309,7 +370,7 @@ def check_result(self, event=None):
self.result_label.config(text="Incorrect typing! Try again.", fg="red")
self.timer_running = False
self.start_time = None
self.result_button.config(state=tk.DISABLED) # Disable until next test starts
self.result_button.config(state=tk.DISABLED)
return "break"
def update_timer(self):
if self.timer_running:
Expand All @@ -331,5 +392,10 @@ def update_timer(self):
self.start_time = None

if __name__ == "__main__":
feature
root = tk.Tk()
app = TypingSpeedTest(root)
root.mainloop()

app = TypingSpeedTest()
app.mainloop()
main