Как очистить консольную строку с помощью функции `print` - PullRequest
0 голосов
/ 04 июня 2019

Предпосылка

Я пытаюсь в основном очистить строку консоли, но не все окно консоли, не используя пробелы, чтобы у меня не было лишних символов из того, что было напечатано в последний раз.Например:

# 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."

Теперь, чтобы решить эту проблему, можно сделать следующее:

import os

def new_print(message, end):
    """
    Clears console, no matter the size of the previous line 
    without wrapping to a new line
    """
    width_of_console = int(os.popen("stty size", "r").read().split()[1])
    # = 17

    print(f"{message :<{width_of_console}}", end=end)

new_print("I don't know you.", end="\r")
new_print("Hello Jim!", end="\r")
# Yields the following (without the quotations) -->
# "Hello Jim!       "

Вопрос

Как мне

  1. Просто распечатать "Hello Jim!", а не "Hello Jim! " (оба явно без кавычек)
  2. Очистить эту строку
  3. Пока не очищается вся консоль (чтобы у меня был выводдругих вещей, кроме последней строки)

В частности, подобные вещи происходят в консоли при изменении размеров (скажем, ширина консоли от 17 до 30), что в моем случае случается довольно часто:

Hello Jim!       Hello Jim!   
    Hello Jim!       Hello Jim
!       Hello Jim!       Hello
 Jim!       Hello Jim!       H
ello Jim!       Hello Jim!    

Я открыт для совершенно нового способа ведения дел, например, urwid или чего-то в этом роде.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Вы можете использовать управляющую последовательность EL (Erase Line) . В Python самый простой способ построить это:

"\033[2K"

Число контролирует поведение последовательности EL:

  • 0: очистить вперед до конца строки (по умолчанию)
  • 1: очистить назад до начала строки
  • 2: очистить всю линию

Последовательность EL не перемещает курсор.

Это поведение довольно стандартное, но если вы хотите быть уверенным, вы можете запросить базу данных terminfo, используя tput.

ТЛ; др:

print("I don't know you.", end="\r")
print("\033[2KHello Jim!", end="\r")
0 голосов
/ 04 июня 2019

Вы можете сделать что-то вроде ниже.Для лучшей видимости я добавил время сна.

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))

...