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)
Проверено и успешно работает в терминале.