У меня есть класс ожидания анимации и класс сканера, который получает информацию о каждом файле в указанном каталоге. Как я должен заставить их работать одновременно: показывать анимацию, когда сканер работает
Я пытался запустить поток, затем сканер и присоединить мой поток к основному после завершения сканера. Анимация не отображается, если указан каталог с огромным количеством файлов
Может, я что-то не так делаю с потоками?
Сканер:
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)
...