Python3:print(somestring,end =' \ r',flush = True)不显示任何内容。

13

我正在按照如何在命令行中创建动画的建议编写进度条。我使用Pycharm并在“运行工具窗口”中运行此文件。

import time
def show_Remaining_Time(time_delta):
    print('Time Remaining: %d' % time_delta, end='\r', flush=True)

if __name__ == '__main__':
    count = 0
    while True:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

然而,如果我运行这个.py文件,代码没有显示任何内容。我做错了什么吗?
我尝试了Jogger的建议,但是如果我使用print函数,它仍然无法工作。
然而,下面的脚本按预期工作。
import time
import sys
def show_Remaining_Time(time_delta):
    sys.stdout.write('\rtime: %d' % time_delta) # Doesn't work if I use 'time: %d\r'
    sys.stdout.flush()
if __name__ == '__main__':
    count = 0
    while True:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

我现在有两个问题:

  1. 为什么stdout有效而print()不起作用。

  2. 为什么这篇文章“如何在命令行中添加动画?”建议在末尾附加\r,而在我的情况下必须在开头写?


1
在交互式解释器中对我来说很好用。你是在奇怪的shell中运行吗?比如IDLE shell? - ShadowRanger
@ShadowRanger 我是在Pycharm的运行工具窗口中运行它。如果我不传递 end='\r',它会像正常一样打印。但我想保持更新同一行。 - spacegoing
是的,PyCharm的运行窗口不是普通的终端。它不能按照你想要的方式处理回车符。请在普通命令提示符中运行。 - ShadowRanger
2
哦,如果这样行得通的话,那么Jorge可能是对的;PyCharm需要在回车符上擦除。 print可以工作,但你需要写成: print('\rTime Remaining: %d' % time_delta,end ='', flush = True)(所以首先要打印回车符,而不是最后)。 - ShadowRanger
@ShadowRanger 是的,它有效!必须传递 end='' 否则它也不会工作。 - spacegoing
我在这里包含了 end='' 是有原因的;默认值是 end="\n"(会自动转换为 os.linesep),这将导致一个新行并且会取消回车符的意图。 - ShadowRanger
2个回答

5
问题在于末尾的 '\r' 会清除你刚刚打印的那一行,怎么办?
import time
def show_Remaining_Time(time_delta):
    print("\r", end='')
    print('Time Remaining: %d' % time_delta, end='', flush=True)

if __name__ == '__main__':
    count = 0
    while True:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

以这种方式,您先清除该行,然后打印所需的显示内容,并在睡眠期间将其保留在屏幕上。
注意:上面的代码已被修改以添加end='',如评论中建议的那样,在某些平台上使代码正常工作。感谢其他读者帮助打造更完整的答案。

2
在我所知道的大多数终端中,\r 并不会清除任何内容。它只是移动光标,需要进一步的输出才能覆盖原有内容。此外,你没有禁用任何一个 print 的自动换行功能,因此净效果是将每个输出都打印在新行上;显式的 '\r' print 没有任何作用。 - ShadowRanger
除了其他问题(如不使用end=''),这对我很有帮助。 - arielnmz
我不得不使用print('\r', end='')print('output', end='', flush=True)来使它按照我的预期工作。虽然如此,还是感谢你提供的良好起点! - Daniel Buckmaster

0

这个方法可以在同一命令行中打印:

import time
def show_Remaining_Time(time_delta):
     print(' \r%d:Time Remaining' % time_delta, end = '',flush=False)

if __name__ == '__main__':
    count = 0
    while True and count < 10:
        show_Remaining_Time(count)
        count += 1
        time.sleep(1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接