【问题标题】:\r keep printing time on same line even after another print is made\r 即使在进行另一次打印后,仍将打印时间保持在同一行
【发布时间】:2020-05-31 04:02:51
【问题描述】:

我有一个线程每 1 秒计算一次时间以获得总经过时间。这很好用,但即使在打印另一行之后,我也需要让它保持在同一行。目前它正在这样做:

[~] 00:00:02
ok #this is a test print to see if it stays on the same line and of course it dosen't.
[~] 00:00:08
def total_elapsed_time(start):
    while True:
        elapsed_time = time.time() - start
        print(colorama.Fore.LIGHTBLUE_EX + "[~] " + time.strftime("%H:%M:%S", time.gmtime(elapsed_time)), end="\r")
        time.sleep(1) #updates every second

这是我的代码。我一直在阅读有关 \r \n 和 \r\n 和 \r 的部分工作,但我仍然需要它始终保持在同一条线上。我不确定这是否可能,尽管我已经看到它是用其他语言完成的,所以我认为它是。

【问题讨论】:

标签: python python-3.x printing newline


【解决方案1】:

你可以使用\r重写底线。

如果您想在时间戳“上方”打印其他内容(例如“ok”):

  • 先用时间戳擦除底线(如果下一个内容不够长,您可能必须用空格覆盖它,然后再次使用\r),然后
  • 打印其他内容(“ok”),然后
  • 在新行的下方再次写入时间戳。

例如,

>>> from datetime import datetime
>>> import time
>>> for c in 'abcdefg':
...   print(datetime.now(), end='\r')  # timestamp
...   time.sleep(1)
...   print(' '*80, end='\r')  # overwrite timestamp line with spaces
...   print(c)  # print something else "above" the next timestamp
...
a
b
c
d
e
f
g
>>>

最终结果没有时间戳,但您可以在它循环时看到它。试试看。

如果您没有开始滚动到底部,则时间戳行会“移动”,但是一旦您打印了足够多的行来填充终端,底线将保持在底部的位置。您还可以使用它来显示进度条和微调器以及类似的东西。

还请注意,您可以使用退格符来备份一个字符,而不是使用回车符来备份到行首。

【讨论】:

  • 你能提供一段代码吗... ngl 很混乱。
  • 这不是我所需要的,它看起来像你说的那样,但我需要它来保持时间戳而不是字母,不知道为什么,但在重新安排语句后我仍然无法得到它将时间戳保持在顶部
  • \r 仅适用于最后一行,抱歉。你的问题只是说它必须在“同一条线上”。如果你想在控制台中编辑任意位置,你确实需要curses之类的东西。
  • 有特殊的“转义序列”可以在终端周围移动光标,类似于 colorama 产生的颜色变化序列。但它的工作方式取决于终端类型,这与在大多数终端上都可以使用的 \r 技巧不同。要做到这一点,您几乎必须重新实现诅咒,所以您不妨直接使用它。
猜你喜欢
  • 2014-03-01
  • 2021-08-21
  • 2018-03-20
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多