【发布时间】:2019-08-07 02:08:25
【问题描述】:
我刚刚了解到要清除您在 Python 中打印的一行,请执行以下操作: sys.stdout.write('\x1b[2K')
为什么这么复杂?那个奇怪的代码是什么意思?打印命令有什么替代方法吗?
Print 确实提供了“结束”选项,允许在行中来回移动,但无法清除您打印的内容。通过 \r 覆盖并不总是有效,特别是如果新行比旧行短。你会得到旧线路的痕迹,所以我需要先清除。 谢谢。
【问题讨论】:
我刚刚了解到要清除您在 Python 中打印的一行,请执行以下操作: sys.stdout.write('\x1b[2K')
为什么这么复杂?那个奇怪的代码是什么意思?打印命令有什么替代方法吗?
Print 确实提供了“结束”选项,允许在行中来回移动,但无法清除您打印的内容。通过 \r 覆盖并不总是有效,特别是如果新行比旧行短。你会得到旧线路的痕迹,所以我需要先清除。 谢谢。
【问题讨论】:
\x1b[2K 就是所谓的ANSI terminal control sequence。它们是 1970 年代的遗留物,至今仍用于(但已大大扩展)来控制终端仿真器。
\x1b 是 ESCAPE 的 ASCII(字面意思是键盘上的 ESC 键)。 [2K 是命令“擦除当前行”。
Python 中有很多库可以用于终端,例如Urwid。这些库将对您隐藏终端的内部工作,并为您提供更高级别的构造来创建 TUI。
【讨论】:
但是,有一种更有效的方法可以做到这一点: 您可以像往常一样使用 print() 命令,并使用
删除屏幕os.system("cls") # For Windows
或
os.system("clear") # For Linux
【讨论】:
我有一个脚本可以打印鼠标的 x、y 坐标:
import pyautogui
import time
while True:
x, y = pyautogui.position()
position_string = "X: {} Y: {}".format(str(x).rjust(4), str(y).rjust(4))
print(position_string, end='')
print('\b' * len(position_string), end='', flush=True)
time.sleep(1)
我要指出的是,您可以打印退格字符 ('\b') 屏幕上出现字符的次数 (len(position_string)),以及在与 end='' 和 flush=True 一起使用时选项,这将在控制台中的单行上不断打印。我还应该注意,这在 IDLE 中不起作用,而仅在实际命令行中起作用!在 IDLE 中,退格字符实际上被打印为一些奇怪的方形......
【讨论】:
这称为ANSI escape code。 2K 是 Erase in Line 的名称。引用链接:
删除部分行。如果 n 为 0(或缺失),则从光标处清除到行尾。如果 n 为 1,则从光标清除到行首。如果 n 为 2,则清除整行。光标位置不变。
您也可以在终端尝试echo -e '\x1b[2k',以便更好地理解。
【讨论】: