Python 如何使用“打印”功能清除控制台行 前提

Python 如何使用“打印”功能清除控制台行 前提,python,console,urwid,Python,Console,Urwid,我试图基本上清除控制台行,但不是不使用空格的整个控制台窗口,这样我就不会有上次打印的额外字符。例如: # This causes characters from the last thing printed: print("I don't know you.", end="\r") print("Hello Jim!", end="\r") # Yields the following (without the quotations) --> # "Hello Jim!ow you."

我试图基本上清除控制台行,但不是不使用空格的整个控制台窗口,这样我就不会有上次打印的额外字符。例如:

# This causes characters from the last thing printed:
print("I don't know you.", end="\r")
print("Hello Jim!", end="\r")

# Yields the following (without the quotations) -->
# "Hello Jim!ow you."
现在要解决这个问题,我们可以这样做:

导入操作系统
def新_打印(消息,结束):
"""
清除控制台,无论前一行的大小
不换行
"""
控制台的宽度=int(os.popen(“stty size”,“r”).read().split()[1])
# = 17
print(f{message:您可以使用EL(擦除行)。在Python中,构造它的最简单方法是:

"\033[2K"
该编号控制EL序列的行为:

  • 0:清除前进直到行结束(默认)
  • 1:向后清除,直到线路开始
  • 2:清除整条线路
EL序列不会移动光标

这种行为相当标准,但如果您想确定,可以使用
tput
查询terminfo数据库

tl;dr:

print("I don't know you.", end="\r")
print("\033[2KHello Jim!", end="\r")
您可以使用EL(擦除行)。在Python中,最简单的构造方法是:

"\033[2K"
该编号控制EL序列的行为:

  • 0:清除前进直到行结束(默认)
  • 1:向后清除,直到线路开始
  • 2:清除整条线路
EL序列不会移动光标

这种行为相当标准,但如果您想确定,可以使用
tput
查询terminfo数据库

tl;dr:

print("I don't know you.", end="\r")
print("\033[2KHello Jim!", end="\r")

你可以像下面这样做。为了更好的能见度,我增加了睡眠时间

import time


def myprint(msg):
    print(msg, end='', flush=True)
    time.sleep(1)
    print('\r', end='', flush=True)
    print(' ' * len(msg), end='', flush=True)
    print('\r', end='', flush=True)


print('These are some other lines 1')
print('These are some other lines 2')

for i in range(10):
    myprint('Hello Jim {}!'.format(i))


你可以像下面这样做。为了更好的能见度,我增加了睡眠时间

import time


def myprint(msg):
    print(msg, end='', flush=True)
    time.sleep(1)
    print('\r', end='', flush=True)
    print(' ' * len(msg), end='', flush=True)
    print('\r', end='', flush=True)


print('These are some other lines 1')
print('These are some other lines 2')

for i in range(10):
    myprint('Hello Jim {}!'.format(i))


在第二个print语句中添加
end=“\r”
在我的终端上没有显示任何内容。我认为应该是:
print(“\033[2KHfasgesgwg],end=”“)
\r
终端的行为是特定的吗?这是OP的原始代码,我认为他们会继续在同一行上打印是有原因的。但是,如果你只是在终端上执行,提示通常会覆盖你以前的行为。这就像一个符咒,谢谢。为了澄清,是的,我会打印ng在同一行上。在第二个print语句中添加
end=“\r”
在我的终端上没有显示任何内容。我认为应该是:
print(“\033[2KHfasgesgwg],end=”“)
\r
终端的行为是特定的吗?这是OP的原始代码,我认为他们会继续在同一行上打印是有原因的。但是,如果你只是在终端上执行,提示通常会覆盖你以前的行为。这就像一个符咒,谢谢。为了澄清,是的,我会打印在同一条线上。