Анимация с использованием потоков - PullRequest
1 голос
/ 14 апреля 2020

У меня есть класс ожидания анимации и класс сканера, который получает информацию о каждом файле в указанном каталоге. Как я должен заставить их работать одновременно: показывать анимацию, когда сканер работает

Я пытался запустить поток, затем сканер и присоединить мой поток к основному после завершения сканера. Анимация не отображается, если указан каталог с огромным количеством файлов

Может, я что-то не так делаю с потоками?

Сканер:

class FileCrawler(object):
    def __init__(self, root):
        super().__init__()

        self._root = root

    def get_files(self):
        for root, dirs, files in walk(self._root):
            for filename in files:
                file = File()
                file.path = path.join(root, filename)
                file.size = stat(file.path).st_size
                file.extension = split_filename(filename)[1]

                yield file

Тема:

class Spinner(threading.Thread):
    def __init__(self, time_step=0.5):
        super().__init__()

        self.animation = ["|o_o|", "|o_-|", "|o_o|", "|-_o|", "|o_o|", "|-_-|", "|^_^|", "|-_-|",
                          "|o_o|", "|O_o|", "|o_o|", "|o_O|", "|o_o|", "|O_O|", "|0_0|", "|O_O|", ]
        self._output = sys.stdout
        self._state = True
        self._time_step = time_step

    def play_animation(self):
        idx = 0
        print()
        while self._state:
            string = f"Please wait, I'm crawling... {self.animation[idx % len(self.animation)]} \r"
            idx += 1
            self._output.write(string)
            self._output.flush()
            time.sleep(self._time_step)

    def run(self):
        self.play_animation()

    def stop(self):
        self._state = False
        self.join()

Вот как я их использую:

...
tables = []

crawler = FileCrawler(root=path)
waiting_ico = Spinner()

waiting_ico.start()
files = crawler.get_files()
waiting_ico.stop()

for file in files:
    table = [file.path, convert_size(file.size), file.extension]
    tables.append(table)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...