Как удалить печать - PullRequest
0 голосов
/ 29 мая 2020

Вот в чем проблема. В следующем коде я использую sh для создания эффекта «движущегося курсора». Вот код:

sys.stdout.write('\033[2K\033[1G')
time.sleep(2)
print ('virus_prevention.fix.virus.|attempt_enter')
time.sleep(2)
sys.stdout.write('\033[2K\033[1G')
print ('virus_prevention.fix.virus|.attempt_enter')
time.sleep(0.1)
sys.stdout.write('\033[2K\033[1G')
print ('virus_prevention.fix.viru|s.attempt.enter')
time.sleep(0.1)
sys.stdout.write('\033[2K\033[1G')
print('virus_prevention.fix.vir|us.attempt.enter')
time.sleep(0.1)
sys.stdout.write('\033[2K\033[1G')
print ('virus_prevention.fix.vi|rus.attempt.enter')
time.sleep(0.1)
sys.stdout.write('\033[2K\033[1G')
print ('virus_prevention.fix.v|irus.attempt.enter')
time.sleep(0.1)
sys.stdout.write('\033[2K\033[1G')
print ('virus_prevention.fix.|virus.attempt.enter')
time.sleep(2)
sys.stdout.write('\033[2K\033[1G')
print ('virus_prevention.fix|virus.attempt.enter')

И вот результат:

[2K[1Gvirus_prevention.fix.virus.|attempt_enter
[2K[1Gvirus_prevention.fix.virus|.attempt_enter
[2K[1Gvirus_prevention.fix.viru|s.attempt.enter
[2K[1Gvirus_prevention.fix.vir|us.attempt.enter
[2K[1Gvirus_prevention.fix.vi|rus.attempt.enter
[2K[1Gvirus_prevention.fix.v|irus.attempt.enter
[2K[1Gvirus_prevention.fix.|virus.attempt.enter

И sys.stdout.write действительно не помогает. Он просто заканчивается добавлением текста перед текущим текстом. Так что, если есть решения, которыми кто-нибудь готов поделиться (Python 3), пожалуйста, сделайте это. (У меня было решение, в котором использовалась многократная очистка экрана с помощью os.system('clear'), что я действительно не хочу использовать.)

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

sys.stdout.write - хорошее начало, но вам также нужно передать «возврат каретки» '\r', чтобы перейти к началу строки. При следующем вызове старые символы будут перезаписаны:

for i in range(10):
    sys.stdout.write(str(i)+'\r')
    time.sleep(1)

Если новая строка короче предыдущей, вы все равно увидите дополнительные символы предыдущей строки. В качестве исправления вы можете добавить несколько дополнительных пробелов, чтобы перезаписать их.

Основное различие между sys.stdout.write и print заключается в том, что print автоматически добавляет перенос строки (\n). Вот почему вы видите sys.stdout.write перед следующей напечатанной строкой.

Запуск этого в интерактивном сеансе Python имеет некоторые странные побочные эффекты, но это нормально, если вы используете его в Python сценарий. Также убедитесь, что между ними нет других команд print(). Это работает только с текущей строкой, а любое '\n' создает новую строку.

sys.stdout.write('virus_prevention.fix.virus.|attempt_enter\r')
time.sleep(2)
sys.stdout.write('virus_prevention.fix.virus|.attempt_enter\r')
print()  # create a linebreak at the end
1 голос
/ 29 мая 2020

Это похоже на то, что вы sh достигли, вам нужно будет настроить его, чтобы он работал там, где вы хотите, чтобы «курсор» отображался

import time

displayText = "Python"
character = '|'

for i in range(len(displayText)+1):
    print(displayText[:i] + character + displayText[i:], end='\r')
    time.sleep(.2)
input()

Это даст желаемый эффект, когда выполняется через консоль / командную строку; но не через Python IDLE Shell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...