Source code for spython.logger.spinner

# Copyright (C) 2017-2022 Vanessa Sochat.

# This Source Code Form is subject to the terms of the
# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.


import sys
import time
import threading
from random import choice


[docs]class Spinner: spinning = False delay = 0.1
[docs] @staticmethod def spinning_cursor(): while 1: for cursor in "|/-\\": yield cursor
[docs] @staticmethod def balloons_cursor(): while 1: for cursor in ". o O @ *": yield cursor
[docs] @staticmethod def changing_arrows(): while 1: for cursor in "<^>v": yield cursor
[docs] def select_generator(self, generator): if generator is None: generator = choice(["cursor", "arrow", "balloons"]) return generator
def __init__(self, delay=None, generator=None): generator = self.select_generator(generator) if generator == "cursor": self.spinner_generator = self.spinning_cursor() elif generator == "arrow": self.spinner_generator = self.changing_arrows() elif generator == "balloons": self.spinner_generator = self.balloons_cursor() if delay is None: delay = 0.2 else: self.spinner_generator = self.spinning_cursor() if delay and float(delay): self.delay = delay
[docs] def run(self): while self.spinning: sys.stdout.write(next(self.spinner_generator)) sys.stdout.flush() time.sleep(self.delay) sys.stdout.write("\b") sys.stdout.flush()
[docs] def start(self): self.spinning = True threading.Thread(target=self.run).start()
[docs] def stop(self): self.spinning = False time.sleep(self.delay)