我有運行不同時間長度的代碼,在此期間線程運行並顯示旋轉的光標。當代碼完成它的任務時,它會打印一些輸出,設置一個事件並停止光標。但是,這留下了在屏幕上打印的最後一個字符。我希望這個被刪除。從屏幕上刪除打印的行
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