【问题标题】:Overwriting the printed line every print for time algorithm为时间算法覆盖每次打印的打印行
【发布时间】:2019-04-05 05:32:15
【问题描述】:

我正在尝试编写时间算法。但是,我在通过覆盖之前的打印成功在同一行打印代码时遇到问题

我尝试使用“\r”将其打印在同一行。但是,它在完成第一分钟后不起作用,秒数像 09,19,29,39 等等。 不知道问题出在哪里。

但是,如果我删除“\r”,程序可以正常工作,只是它每次都会在新行中打印时间。我想在同一行打印。

import time
for i in range(24):
    for a in range(60):
        for s in range(60):
            print(i,":",a,":",s, end='\r')
            time.sleep(1)

我希望输出与正常时间一样。但是它的工作方式不一样,不知道为什么

【问题讨论】:

  • 我确信这个问题之前已经被问过。让我看看……
  • 它询问如何替换打印语句
  • 是的,我查看了一些类似的,从中我发现了“\r”。但是,它仍然无法正常工作。原来还有其他错误
  • 是的,我把它命名为 time.py

标签: python python-3.x line-breaks


【解决方案1】:

第一分钟之后012 等后面的9 字符只是在第一分钟的最后一秒打印的59 中的9 ,因为个位数秒的宽度不足以覆盖9。您可以将每个数字的输出格式化为宽度为 2,并且由于我们在这里处理时间,因此用前导 0 填充数字:

import time
for i in range(24):
    for a in range(60):
        for s in range(60):
            print('%02d:%02d:%02d' % (i, a, s), end='\r')
            time.sleep(1)

如果您在 IDE 中运行它,它不会输出任何内容,因为输出会被缓冲,直到收到换行符为止。您可以使用flush=True 参数强制刷新输出,但是IDE 仍然不会输出任何内容,因为\r 字符会由于IDE 的预处理而擦除输出。您可以在打印 \r 之前先刷新输出:

import time
for i in range(24):
    for a in range(60):
        for s in range(60):
            print('%02d:%02d:%02d' % (i, a, s), end='', flush=True)
            time.sleep(1)
            print('', end='\r')

【讨论】:

  • 我最近刚开始使用 Visual Studio 代码作为我的编辑器,结果发现这在终端中运行良好,但只是想问一下为什么在空闲时运行不正常?
  • 在IDE中,输出是缓冲的,IDE只有在有换行符时才会真正将缓冲区输出到屏幕上,并且这段代码没有换行符输出。
  • 我尝试在 IDLE 上运行新解决方案和旧解决方案,但仍然导致输出时间并排打印
  • Python 的 IDLE 根本不支持使用 \r 字符将光标移动到行首,因此 IDLE 根本不可能。请使用不同的 IDE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2014-10-14
相关资源
最近更新 更多