2016-10-11 94 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