Как создать вращающийся курсор командной строки?

Я не имею определенного сайта, но склоняюсь к, просто гуглят основные ключевые слова того, что я ищу. Существует много сайтов там, однако, у меня есть лучшие ответы здесь для очень определенного материала.

60
задан martineau 27 October 2018 в 15:44
поделиться

1 ответ

Улучшенная версия от @Victor Moyseenko как исходная версия имела немного проблем

  1. , оставлял символы счетчика после того, как вращение завершено
  2. , и иногда приводите к удалению после первого символа вывода также
  3. , избегает редкого состояния состязания путем помещения поточной обработки. Блокировка () на выводе
  4. отступает к более простому выводу, когда никакой tty не доступен (никакое вращение)
import sys
import threading
import itertools
import time

class Spinner:

    def __init__(self, message, delay=0.1):
        self.spinner = itertools.cycle(['-', '/', '|', '\\'])
        self.delay = delay
        self.busy = False
        self.spinner_visible = False
        sys.stdout.write(message)

    def write_next(self):
        with self._screen_lock:
            if not self.spinner_visible:
                sys.stdout.write(next(self.spinner))
                self.spinner_visible = True
                sys.stdout.flush()

    def remove_spinner(self, cleanup=False):
        with self._screen_lock:
            if self.spinner_visible:
                sys.stdout.write('\b')
                self.spinner_visible = False
                if cleanup:
                    sys.stdout.write(' ')       # overwrite spinner with blank
                    sys.stdout.write('\r')      # move to next line
                sys.stdout.flush()

    def spinner_task(self):
        while self.busy:
            self.write_next()
            time.sleep(self.delay)
            self.remove_spinner()

    def __enter__(self):
        if sys.stdout.isatty():
            self._screen_lock = threading.Lock()
            self.busy = True
            self.thread = threading.Thread(target=self.spinner_task)
            self.thread.start()

    def __exit__(self, exception, value, tb):
        if sys.stdout.isatty():
            self.busy = False
            self.remove_spinner(cleanup=True)
        else:
            sys.stdout.write('\r')

пример использования класса Счетчика выше:


with Spinner("just waiting a bit.. "):

        time.sleep(3)

загруженный код на https://github.com/Tagar/stuff/blob/master/spinner.py

1
ответ дан 24 November 2019 в 17:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: