Найти - Пользователи
Полная версия: Wake up, Neo или как выводить текст с эффектом "ввода с клавиатуры"
Начало » Python для новичков » Wake up, Neo или как выводить текст с эффектом "ввода с клавиатуры"
1
Apxumekmop
День добрый ребятки. Возникла проблема, которую в гугле не найти, а самому придумать никак не получается. Было проделано много попыток, но всё бесполезно.
Задача: Последовательно вывести предложение в 1 строку. Т.е не просто эффект ctrl+v - ctrl+c, а эффект набора текста на клавиатуре. Всё что я хочу сделать, можно увидеть на нижеприведенной гиф-анимации.



Вывод побуквенно с малой задержкой, примерно в 0.1 - 0.2 секунды, что бы получился такой красивый эффект. Сам смысл проблемы в том, что строкой хрен выведешь, а столбиком я это вывести могу как 2 пальца обосса…
import time
my_string = "Wake up, Neo..."
for string in my_string:
    time.sleep(0.1)
    print(string)

Столбиком выводится просто прекрасно, но нам то нужно всё вывести в 1 строку. Поэтому полез в гугл и нарыл вот такую интересную конструкцию:
print(x, y, z, sep = "", end = "")

sep - это разделитель, по умолчанию стоит пробел.
end - это конечный символ, по умолчанию стоит символ переноса строки.
И вот я радостный, понимаю, что могу убрать долбаный перевод строки и вывести всё в строчку. Видоизменяю свою первую писанину и вуаля:
import time
my_string = "Wake up, Neo..."
for string in my_string:
    time.sleep(0.1)
    print(string, end = "")

Предвкушая победу, запускаю скрипт и вижу, как ничего не происходит, а потом просто стандартно выпуливает наше Wake up, Neo, начисто проигнорив все time.sleep().
Почему нифига не получается то? Если кто знает другие способы, пишите, буду благодарен.
ZerG
НА форуме уже была тема подобная - чото там проефект печатной машинки - поищите
Apxumekmop
Спасибо, нашел, вот тема, если вдруг кому надо - http://python.su/forum/topic/29676/.
Спасительной шлюпкой оказался аргумент flush. На деле всё будет выглядеть так:
import time
my_string = "Wake up, Neo..."
for string in my_string:
    time.sleep(0.1)
    print(string, end = "", flush=True)

Только я так полностью и не допёр, почему при помощи flush всё работает. Есть небольшое определение ему:
Этот аргумент используется если ты используешь аргумент file, который позволяет указывать объект файла в который нужно записать вывод. По умолчанию (с flush=False), запись в файл произойдёт после выхода из цикла, а если flush=True запись в файл будет произведена сразу-же.
noob_saibot
Whether output is buffered is usually determined by file, but if the flush keyword argument is true, the stream is forcibly flushed.
Пишет в буфер когда False, либо принудительно скидывает в stdout при True.
JOHN_16
Есть несколько более улучшенная версия - с симуляцией разной скорости набора символов. Примерно так:
#!/usr/bin/env python3
import time
import random
def neo_print(value, base_delay=0.1):
    for char in value:
        print(char, end='', flush=True)
        time.sleep(base_delay + random.randint(1, 100) * base_delay / 100)
    print()
if __name__ == '__main__':
    neo_print('Hello, Neo! Matrix waiting for you! Your Mr. Smith!')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB