Windows Terminal中CLI光标保存恢复及清屏ANSI序列失效问题
问题分析与解决方案
你的代码里的光标保存/恢复序列写法有误,Windows Terminal不识别带空格的\x1B 7和\x1B 8,正确的ANSI序列应该是不带空格的\x1B7(保存光标位置)和\x1B8(恢复光标位置)。
\x1B[0K序列是有效的,它的作用是清除从当前光标位置到行尾的内容,只要光标位置正确就能正常生效。
修正后的代码如下:
import readchar import sys print("Reading input: ", end="") sys.stdout.flush() s = "" # 先保存初始光标位置 print("\x1B7", end="") sys.stdout.flush() while True: # 恢复到保存的光标位置 print("\x1B8", end="") sys.stdout.flush() char = readchar.readchar() # 清除光标到行尾的内容 print("\x1B[0K", end="") sys.stdout.flush() if char == "\r": break print(char, end="") s += char # 再次保存当前光标位置 print("\x1B7", end="") # 输出预输入文本 ahead_text = "#" print(ahead_text, end="") sys.stdout.flush() print("\nresult was", s) sys.stdout.flush()
如果你需要更兼容的备选方案,也可以使用光标位置查询与移动命令:
\x1B[6n:查询当前光标位置,终端会返回\x1B[行;列R格式的响应\x1B[行;列H:将光标移动到指定行和列
不过这种方式需要额外处理终端的响应,实现起来比保存恢复光标更繁琐,优先推荐修正光标序列的写法。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

