【问题标题】:cross-platform dynamic terminal printing跨平台动态终端打印
【发布时间】:2021-06-24 13:57:11
【问题描述】:

考虑这段代码:

import time

while True:
    print(f"{object}")
    doing_something_to_object(object)
    object.update()
    time.sleep(3)

输出看起来像这样,换行:

value
value
value
value

我想做一些事情,以便当 object 准备好显示时,object 更新在屏幕上。

为了更好的解释,

我想输出一个具有持续更新值的屏幕。:

*--------------------------------------*

value1                          value2

*--------------------------------------*

如果我要在循环中打印它,在下次打印之前更新字符串中的值,它看起来像这样(我不想要这个):

*--------------------------------------*

value1                          value2

*--------------------------------------*
*--------------------------------------*

value1                          value2

*--------------------------------------*
*--------------------------------------*

value1                          value2

*--------------------------------------*
*--------------------------------------*

value1                          value2

*--------------------------------------*

有哪些方法可以在不使用 pygame 或 tkinter 的情况下做到这一点? curses 应该可以解决问题,但它不是跨平台的。 linux和windows都有curses的东西吗?

【问题讨论】:

    标签: python-3.x output stdout


    【解决方案1】:

    如果我理解正确,你想更新它显示的值,而不是在它下面再次打印它......

    在终端/CLI 窗口(据我所知,所有这些窗口)中,一旦打印了一行,就无法修改或删除它 - 当前提示/输出行之前的所有内容都是只读文本。 但是你仍然可以改变你当前所在的线路,这样做的方法是

    1. 在完成之前不要打印换行符 (\n),并且
    2. 使用回车键 (\r) 将光标移动到行首,这样下一个值就会写在前一个值的“顶部”

    请注意,“\r”不是退格,例如print("abcdefg\rxyz") 将导致xyzdefg。根据需要用空格填充文本。

    import time
    
    t1 = time.time()
    obj = 0
    
    while obj < 100000000:
        obj = time.time() - t1
        print(f"\r{obj}", end='')
        time.sleep(0.5)
    
    print("\nDone !")
    
    

    【讨论】:

    • 正确。 curses 最适合我的情况。唯一的问题是它不是跨平台的。
    猜你喜欢
    • 2018-04-03
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多