我想编写一个python脚本,在终端的最后一行显示其当前进度,类似于apt
(不是apt-get
)的行为。我知道有ANSI控制序列与终端进行交互,但问题是我想调用其他程序(使用subprocess
)来生成自己的输出。我不希望这些程序覆盖我的进度。
可能有多个子进程同时运行。我正在使用multithreading
模块,每个线程都做一些工作,然后调用并等待子进程,然后进行清理工作。我不介意子进程的输出是混合的,只要最后一行不用。
程序退出时,应清除最后一行。
答案 0 :(得分:3)
感谢PM 2Ring's comment,我找到了我需要的一切。
控制序列"\033[X;Yr"
(或"\x1b[X;Yr"
)告诉终端仅将行X
滚动到Y
。我没有测试X != 0
时会发生什么,因为我想保留回滚缓冲区。 \033[r
重置终端以滚动整个窗口。
要动态,你应该确定终端的高度,然后减去所需的静态行数,然后适当地设置滚动范围。
为避免加扰输出,在设置滚动范围后,应确保光标不在静态区域。例如,您的窗口具有[w = 120,h = 40]行的大小,并且您需要2个静态状态行。确定光标位置(例如[x = 5,y = 39]),如果它在窗口的最后两行内,则打印2个换行符,然后将光标定位在[x = 5,y =(h-2) = 38]。
要更新状态区域,请保存光标位置,将其移至状态行,清除状态行,打印状态(不带尾随换行符),恢复光标位置。有转义序列可以保存和恢复位置。重置滚动范围时清除状态区域。
有用的链接: