我在Windows 7(位(上的Python(32位2.7.2(中使用Colorama(64位(,它非常适合在控制台中为文本着色,但是在让它移动光标时遇到了问题。
具体来说,如果我使用 ANSI 代码向上移动一行,当光标远离屏幕底部时它可以工作,但是当光标靠近底部时,光标无法正确向上移动,然后文本开始进一步打印页面导致它滚动。
我用来向上移动一行的代码是:
sys.stdout.write('x1b[4A')
其中 4 将其向上移动四行(类似于"\x1b[8A"的内容会将其向上移动八行(
我不确定这是否是我对ANSI代码的工作原理缺乏了解,或者这是否是科罗拉马州的问题。
要重新创建它,请在普通的Windows命令提示符(cmd.exe(或Console2中运行类似的东西(似乎没有区别(
from __future__ import print_function
import colorama
from colorama import Fore, Back, Style
import sys
def main():
print('Blah')
print('Blah')
print('Blah')
print('Blah')
print('Blah')
print('Blah')
print('Blah')
print('Blah')
print('Blah')
print('Blah')
print('Blah')
sys.stdout.write('x1b[6A')
sys.stdout.write('some text')
if __name__ == '__main__':
main()
如果你在屏幕顶部附近运行上面的代码,它最终会在">Blah"输出中写入"一些文本",但如果你在屏幕底部附近启动它,">一些文本"将在最后,光标似乎根本没有向后滚动。
我特别需要向上移动光标,以便将其放置在相对于其他输出的基础上,而不是给它一个绝对的屏幕位置(即将它移动到位置 x,y(
关于从哪里开始的任何建议?
添加colorama.init()
。它在Windows中是必不可少的,但在*nix系统中是可选的。
在 Windows 上,调用 init(( 将从发送到 stdout 或 stderr 的任何文本中过滤出 ANSI 转义序列,并将它们替换为等效的 Win32 调用。在其他平台上,调用 init(( 不起作用。
要在程序退出之前停止使用 colorama,只需调用 deinit()
即可。这会将标准输出和标准输出恢复到其原始值,以便禁用科罗拉马州。要再次恢复使用科罗拉马州,请致电reinit()
;再次拨打init()
更便宜(但做同样的事情(。
colorama.init()
接受一些 **kwarg 来覆盖其默认行为。
默认值为
colorama.init(convert = True, wrap = True, autoreset=False, strip = None)
init(autoreset=True)
将在每次语句后重置颜色/换行/条带更改。
colorama.init(autoreset=True)
# 将颜色重置为默认值,对于每个语句
colorama.init(convert = True)
# 的工作方式与 colorama.init(( 相同
colorama.init(convert = False)
# 当我们想要停止颜色变化时使用
colorama.init(wrap = True)
# 的工作方式与 colorama.init(( 相同
colorama.init(convert = False)
# 当我们想要停止颜色变化时使用
您应该从colorama导入"init"并调用"init((",然后再尝试向上移动光标。