diff --git a/typing_speed_test.py b/typing_speed_test.py index bdb4586..9283494 100644 --- a/typing_speed_test.py +++ b/typing_speed_test.py @@ -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 = { @@ -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)) @@ -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) @@ -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) @@ -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() # ============================== @@ -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()) @@ -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: @@ -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() \ No newline at end of file + main