这是进度微调器的代码:
import sys
import time
def spinning_cursor():
while True:
for cursor in '|/-\\':
yield cursor
spinner = spinning_cursor()
for _ in range(50):
sys.stdout.write(spinner.next())
sys.stdout.flush()
time.sleep(10)
sys.stdout.write('\b')
输出
python2.7 test.py
|
由于循环睡眠10秒钟,它旋转非常缓慢......
如何在过程休眠期间继续旋转微调器?
答案 0 :(得分:2)
你可以以较小的步数睡觉,直到达到10秒:
index.html
但是这会阻塞你的主线程,所以只有你想在Python程序中不做任何其他事情等待10秒钟才会有用(例如,等待一些外部进程完成)。
如果要在微调器旋转时运行其他Python代码,则需要两个线程 - 一个用于微调器,一个用于主要工作。你可以这样设置:
import sys, time
def spinning_cursor():
while True:
for cursor in '|/-\\':
yield cursor
spinner = spinning_cursor()
end_time = time.time() + 10
while time.time() < end_time:
sys.stdout.write(spinner.next())
sys.stdout.flush()
time.sleep(0.2) # adjust this to change the speed
sys.stdout.write('\b')
答案 1 :(得分:1)
您必须创建一个单独的线程。下面的例子大致说明了如何做到这一点。但是,这只是一个简单的例子。
import sys
import time
import threading
class SpinnerThread(threading.Thread):
def __init__(self):
super().__init__(target=self._spin)
self._stopevent = threading.Event()
def stop(self):
self._stopevent.set()
def _spin(self):
while not self._stopevent.isSet():
for t in '|/-\\':
sys.stdout.write(t)
sys.stdout.flush()
time.sleep(0.1)
sys.stdout.write('\b')
def long_task():
for i in range(10):
time.sleep(1)
print('Tick {:d}'.format(i))
def main():
task = threading.Thread(target=long_task)
task.start()
spinner_thread = SpinnerThread()
spinner_thread.start()
task.join()
spinner_thread.stop()
if __name__ == '__main__':
main()
答案 2 :(得分:0)
生成两个主题A
和B
。线程A
运行cmd
完成。线程B
显示旋转光标并等待线程A
退出,这将在cmd
完成时发生。此时,线程B
清除旋转光标,然后退出。
或者使用现有的库而不是重新发明轮子。考虑progressbar库。您需要RotatingMarker
进度指示器。