import time from threading import Event, Thread from typing import Callable, Optional class CountdownTimer(Thread): def __init__( self, seconds: int, timer_tick_callback: Optional[Callable[[int], None]] = None, timer_done_callback: Optional[Callable[[], None]] = None, ) -> None: self.seconds = seconds self.stop_event = Event() self.timer_tick_callback = timer_tick_callback self.timer_done_callback = timer_done_callback super().__init__(daemon=True) def run(self) -> None: time_left = self.seconds while time_left and not self.stop_event.is_set(): time.sleep(1) time_left -= 1 if self.timer_tick_callback and not self.stop_event.is_set(): self.timer_tick_callback(time_left) if time_left == 0 and self.timer_done_callback: self.timer_done_callback() def stop(self) -> None: self.stop_event.set()