Python, как сделать простую анимированную загрузку во время процесса

Это в значительной степени то, что у меня есть прямо сейчас:

import time
import sys

done = 'false'
#here is the animation
def animate():
    while done == 'false':
        sys.stdout.write('\rloading |')
        time.sleep(0.1)
        sys.stdout.write('\rloading /')
        time.sleep(0.1)
        sys.stdout.write('\rloading -')
        time.sleep(0.1)
        sys.stdout.write('\rloading \\')
        time.sleep(0.1)
    sys.stdout.write('\rDone!     ')

animate()
#long process here
done = 'false'

и я хочу получить его так, чтобы "while" script функционировал независимо, и он продолжает процесс, в то время как анимация продолжается до тех пор, пока не закончится процесс обработки переменной "done", false ", останавливая анимацию и заменяя ее" Готово! ". Этот метод будет по существу запускать сразу два сценария; есть ли способ сделать это?

Ответ 1

Использовать поток:

import itertools
import threading
import time
import sys

done = False
#here is the animation
def animate():
    for c in itertools.cycle(['|', '/', '-', '\\']):
        if done:
            break
        sys.stdout.write('\rloading ' + c)
        sys.stdout.flush()
        time.sleep(0.1)
    sys.stdout.write('\rDone!     ')

t = threading.Thread(target=animate)
t.start()

#long process here
time.sleep(10)
done = True

Я также сделал несколько незначительных изменений в вашей функции animate(), единственной действительно важной была добавка sys.stdout.flush() после вызовов sys.stdout.write().

Ответ 2

Я вижу, это проблема с потоками, а не проблема анимированной загрузки. Большинство ответов, представленных в этой ветке QA, содержат только псевдокод и оставляют читателя самостоятельно.

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

Читатель может изменять в соответствии со своими потребностями.

# импорт пакетов Python

import sys, time, threading

# Определите свой процесс.

 # Here is an example of the process function:

def the_process_function():
    n = 20
    for i in range(n):
        time.sleep(1)
        sys.stdout.write('\r'+'loading...  process '+str(i)+'/'+str(n)+' '+ '{:.2f}'.format(i/n*100)+'%')
        sys.stdout.flush()
    sys.stdout.write('\r'+'loading... finished               \n')

# Определите функцию анимированных персонажей:

def animated_loading():
    chars = "/—\|" 
    for char in chars:
        sys.stdout.write('\r'+'loading...'+char)
        time.sleep(.1)
        sys.stdout.flush() 

# определить имя и цель вашей темы

the_process = threading.Thread(name='process', target=the_process_function)

# начать тему

the_process.start()

# пока процесс активен, вызвать функцию animated_loading()

while the_process.isAlive():
    animated_loading()

Основные шаги описаны в закомментированной строке.

Ответ 3

Попробуйте этот

import time
import sys


animation = "|/-\\"

for i in range(100):
    time.sleep(0.1)
    sys.stdout.write("\r" + animation[i % len(animation)])
    sys.stdout.flush()
    #do something
print("End!")

Ответ 4

import sys, time, threading

def your_function_name() :
    # do something here

def loadingAnimation(process) :
    while process.isAlive() :
        chars = "/—\|" 
        for char in chars:
            sys.stdout.write('\r'+'loading '+char)
            time.sleep(.1)
            sys.stdout.flush()

loading_process = threading.Thread(target=your_function_name)
loading_process.start()
animated_loading(loading_process)
loading_process.join()

Ответ 5

Все это делается с помощью нескольких строк кода:

import time
import os

anime = ["|", "/", "-", "\\"]

done = False

while done == False:
    for i in anime:
        print('Please wait while system is Loading...', i)
        os.system('clear')
        time.sleep(0.1)

Проверено и успешно работает в терминале.