2016-09-30 2 views
0

У меня есть загрузочная-функцию:Как показать анимацию в Python, пока функция работает?

def animation(loadingtext): 
    word = list(loadingtext) 
    for i in range(0,len(word)): 
     os.system('cls') 
     lower=word[i-1].lower() 
     word[i-1]=lower 

     caps=word[i].upper()  
     word[i]=caps 

     wordstr=''.join(word) 
     print(wordstr) 
     time.sleep(0.3) 

И я хочу, чтобы отобразить эту функцию в то время как некоторые работы выполняются (например, fetcha большой SQL-запрос). Или как я могу сделать некоторые другие загрузки анимаций?

Заранее спасибо, Патрик!

ответ

0

Сначала я бы не использовал system("cls"): он очищает экран, когда может быть интересно посмотреть, что было написано. Я бы просто добавил \r к wordstr.

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

Вот что может выглядеть следующим образом:

def animation(loadingtext): 
    word = list(loadingtext) 
    for i in range(0,len(word)): 
     #os.system('cls') 
     lower=word[i-1].lower() 
     word[i-1]=lower 
     caps=word[i].upper() 
     word[i]=caps 
     wordstr=''.join(word) 
     sys.stdout.write('\r' + wordstr) 
     time.sleep(0.3) 

def start_anim(txt): 
    ev = threading.Event() 
    def _loop(ev, txt): 
     while not ev.is_set(): 
      animation(txt) 
    threading.Thread(target=_loop, args=(ev, txt)).start() 
    return ev 

Вы могли бы использовать его таким образом:

ev = start_anim(loadingtext) 
# heavy work - loadingtext is animated on screen 
ev.set() # stop the animation 
+0

Большое спасибо! Действительно полезно! Для всех остальных: вам нужно добавить «import threading» в верхней части файла. И замените в «ev = start_anim (loadtext)» «загрузочный текст» на строку var OR! :) – Patrick