\r
是回车符,光标将移动到行的开头(第0列)。从那里开始,写入更多文本将覆盖以前写过的内容,因此最终只保留了最后一行(长到足以覆盖之前所写的所有内容)。
你需要 \n
,一个换行符,它使光标移到下一行(并再次从第0列开始):
print("Orders: " + str(OrderCount) + "\nOperations: " + str(OperationCount), end="\n\n")
不要使用 str()
和 +
进行字符串拼接,考虑使用带有str.format()
的字符串模板:
print("Orders: {}\nOperations: {}\n".format(OrderCount, OperationCount))
或者一个格式化字符串字面值:
print(f"Orders: {OrderCount}\nOperations: {OperationCount}\n")
如果您想使用 \r
来更新两行,可以使用ANSI控制码;打印 \x1B[2A
(ESC [ 2 A) 将光标向上移动2次,根据需要进行调整。这是否起作用取决于您支持的平台。
在我的Mac上,以下演示可行并且可以更新两行随机数字;我使用 ESC [ 0 K 确保行中剩余的任何字符都被擦除:
import random, time
orders = 0
operations = 0
UP = "\x1B[3A"
CLR = "\x1B[0K"
print("\n\n")
while True:
orders += random.randrange(1, 3)
operations += random.randrange(2, 10)
print(f"{UP}Orders: {orders}{CLR}\nOperations: {operations}{CLR}\n")
time.sleep(random.uniform(0.5, 2))
演示:
![动画GIF演示了2行文本多次更新](https://istack.dev59.com/6cW0H.gif)
你也可以使用Curses切换到完全的终端控制,或者将所有内容放在一行上。如果您要选择Curses方法,请注意,Windows兼容性最好是不可靠的。
print(f"{UP}订单:{orders}{CLR}操作:{operations}{CLR}", end="\r")
- DagicCross