如何将python中的stdout指针移动到上一行?

时间:2014-07-17 18:39:12

标签: python buffer

我正在尝试在等待用户输入时打印计数器。所以我在自己的线程中生成了计数器并让它运行如下:

while waiting:
  print('Elapsed time:', time, end='\r')

end参数用于将指针设置为当前行的开头,从而更新显示的时间,而不是每次更新时都会泛滥屏幕。

这样可行但是我想在这下面显示类似于许多基于控制台的文本编辑器中显示的命令,我找不到这样做的方法。我想我的问题是有没有办法设置打印将写入指针的位置?

我首先通过sys.stdout,但是当我尝试执行sys.stdout.seek(anoffset)(或许多其他sys.stdout调用)时,我得到一个错误,指出它不可搜索。读取电话说它不可读等等我不知道该怎么做。如果我可以寻找除了遍历整个文件以外的其他方法,那么有一种简单的方法来寻找前一行吗?

3 个答案:

答案 0 :(得分:3)

你不能。标准输出只是并不意味着来对终端进行复杂的操作。实际上即使使用\r也不可能移植到所有终端。

你想要的是一个成熟的TUI库。标准库提供了curses模块来实现它,即使它是特定于UNIX的。

在ANSI终端上,你可以使用一些escape sequences,即使你手动使用它们也很困难。

通过cygwin和类似的方式在Windows上使用curses有一些可能性,但是我不确定它们在实践中是如何工作的。

似乎PDCurses在那里工作。此库应与curses兼容,因此您应该能够编写适用于每个受支持平台的代码,只需少量检查。已存在python binidings:python-pdcurses

然而python-pdcurses似乎只是python2。

答案 1 :(得分:1)

答案 2 :(得分:0)

我不是这方面的专家,但我很确定你无法支持该流程中的位置。

每次有更新时,不同的方法是重新打印整个屏幕。然后在最后一行,打印横幅或菜单命令。假设一个40行显示终端,这里有一些伪代码(我没有尝试过这段代码):

#Some of the hard-coded values might be off. 
#I'm perpetually off by 1 or 2 for these kinds of thing.

listOfMessagesToPrint = [1,2,3,4,5] #list of strings. Each less than 80 characters.

print "This is the title at the top of the page"

#Print as many messages as will fit on the screen. Assume new messages are appended
for each in listOfMessagesToPrint[-38:]:
    print each

remainingLines = 38 - len(listOfMessagesToPrint)
while remainingLines > 0:
    print " "
    remainingLines -= 1

print ("This is last line on the screen")