我试图在等待用户输入时打印计数器。所以我在它自己的线程中生成计数器,并让它运行如下代码:
while waiting:
print('Elapsed time:', time, end='r')
end参数用于将指针指向当前行的开头,从而更新显示的时间,而不是每次更新都充斥屏幕。
这工作得很好,但是我想在这个下面显示一些类似于在许多基于控制台的文本编辑器中显示的命令,我找不到这样做的方法。我想我的问题是有没有一种方法可以设置print要写入的指针的位置?
我首先想到sys。但是当我尝试执行sys.stdout.seek(anoffset)(或许多其他sys.stdout)时,stdout调用),我得到一个错误,指出它是不可搜索的。Read调用说它不可读,等等。我不知道该怎么办。如果我可以搜索而不是遍历整个文件有没有一种简单的方法可以搜索到前一行?
您不能。标准输出只是,并不意味着可以对终端进行复杂的操作。事实上,即使使用r
也可能无法移植到所有终端。
你需要的是一个成熟的TUI库。标准库提供了curses
模块来实现这一点,尽管它是特定于UNIX的。
在ANSI终端上,您可以使用一些转义序列,尽管手动使用它们会非常困难。
有一些使用curses
通过cygwin和类似的窗口的可能性,但我不确定他们如何在实践中工作。
似乎PDCurses在那里工作。这个库应该与curses
兼容,因此您应该能够编写在每个支持的平台上工作的代码,只需要进行少量的检查。已经存在python绑定:python-pdcurses
.
然而python-pdcurses
似乎只有python2。
您可能希望在curses
https://docs.python.org/2/howto/curses.html windows-and-pads
我不是这方面的专家,但我很确定你不能在那个流中备份位置。
另一种方法是每次有更新时重新打印整个屏幕。然后在最后一行,打印横幅或菜单命令。假设有一个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")