From 7c9dcea3592c04d8345cec093b1f08e5cb5da9a9 Mon Sep 17 00:00:00 2001 From: dw-0 Date: Sun, 30 Jun 2024 16:01:11 +0200 Subject: [PATCH] feat: add loading spinner Signed-off-by: Dominik Willner --- kiauh/utils/spinner.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 kiauh/utils/spinner.py diff --git a/kiauh/utils/spinner.py b/kiauh/utils/spinner.py new file mode 100644 index 0000000..d4c1ced --- /dev/null +++ b/kiauh/utils/spinner.py @@ -0,0 +1,33 @@ +import sys +import threading +import time + + +class Spinner: + def __init__(self, message="Loading", delay=0.2): + self.message = f"{message} ..." + self.delay = delay + self._stop_event = threading.Event() + self._thread = threading.Thread(target=self._animate) + + def _animate(self): + animation = ["◜", "◝", "◞", "◟"] + while not self._stop_event.is_set(): + for char in animation: + sys.stdout.write(f"\r{char} {self.message}") + sys.stdout.flush() + time.sleep(self.delay) + if self._stop_event.is_set(): + break + sys.stdout.write("\r" + " " * (len(self.message) + 1) + "\r") + sys.stdout.flush() + + def start(self): + self._stop_event.clear() + if not self._thread.is_alive(): + self._thread = threading.Thread(target=self._animate) + self._thread.start() + + def stop(self): + self._stop_event.set() + self._thread.join()