2016-10-11 133 views
2

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

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()                                                              
+0

嘗試'sys.stdout.flush()'ING寫'\ B'後,太。 – alexpeits

+0

@ Alex.P試過這個,但沒有運氣,謝謝。 – Paul

+0

當你使用'sys.stderr'作爲微調而不是'sys.stdout'時會發生什麼。可能'sys.stderr.write('\ b')'將會工作,而不是因爲它被寫入另一個流。 – nauer

回答

1

的問題是,主線程不等待spinning_cursor之一。因此,這裏是發生了什麼(我能複製它):

main          | spinning 
--------------------------------------------------------------------------- 
starts spinning thread     | starts 
works         | displays a *spinning* cursor 
ends working        | == 
sets event        | waits for running time 
continues and writes to stdout (*)  | may be still waiting ... 
...          | writes its last backspace and exits (*) 

(*)我可以證明,主線程開始甚至與finalywrite發生的歷史前紡線可以寫寫在標準輸出通過在線程末尾寫入可打印的字符來實現其最後的退格。那個角色印的太晚了。

如何解決:只需joinspinning_cursor螺紋:

def copy(): 
    processing_flag = Event() 
    t = Thread(target = spinning_cursor, kwargs = {'event': processing_flag}) 
    t.start() 
    try: 
     ... 
    except: 
     ... 
    finally: 
     processing_flag.set() 
     t.join() # waits for the thread to output its last backspace 
+0

偉大的答案,我會實現這個,而不是我的黑客。非常感謝! – Paul