我有运行不同时间长度的代码,在此期间线程运行并显示旋转的光标。当代码完成它的任务时,它会打印一些输出,设置一个事件并停止光标。但是,这留下了在屏幕上打印的最后一个字符。我希望这个被删除。从屏幕上删除打印的行
def spinning_cursor(event):
for j in itertools.cycle('/-\|'):
if not event.is_set():
sys.stdout.write(j)
sys.stdout.flush()
time.sleep(0.1)
sys.stdout.write('\b')
else:
#sys.stdout.write('\b')
return
我看到屏幕上看起来是这样的:
paul#
Writing file...
/
info: file has been written
paul#
我想如果设定了事件/
消失。在返回之前我已经尝试了sys.stdout.write('\b')
(取消注释上面的行),但是这段代码似乎在主线程中的后续打印之后运行,并且它什么都不删除。为什么是这样?一个更明显的例子,我在else
返回之前使用sys.stdout.write('TEST')
。
paul#
Writing file...
/
info: file has been written
TESTpaul#
我已经通过在主线程打印之前连升一行找到了一个解决方案,但因为有许多代码路径是凌乱:
CURSOR_UP_ONE = '\x1b[1A'
sys.stdout.write(CURSOR_UP_ONE)
这里是纺纱光标是如何被调用。有任何想法吗?
def copy():
processing_flag = Event()
Thread(target = spinning_cursor, kwargs = {'event': processing_flag}).start()
try:
...
except:
...
finally:
processing_flag.set()
尝试'sys.stdout.flush()'ING写'\ B'后,太。 – alexpeits
@ Alex.P试过这个,但没有运气,谢谢。 – Paul
当你使用'sys.stderr'作为微调而不是'sys.stdout'时会发生什么。可能'sys.stderr.write('\ b')'将会工作,而不是因为它被写入另一个流。 – nauer