Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 15, 2016 11:51:00

Apxumekmop
Зарегистрирован: 2016-03-30
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Wake up, Neo или как выводить текст с эффектом "ввода с клавиатуры"

День добрый ребятки. Возникла проблема, которую в гугле не найти, а самому придумать никак не получается. Было проделано много попыток, но всё бесполезно.
Задача: Последовательно вывести предложение в 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().
Почему нифига не получается то? Если кто знает другие способы, пишите, буду благодарен.

Офлайн

#2 Июнь 15, 2016 12:35:01

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Wake up, Neo или как выводить текст с эффектом "ввода с клавиатуры"

НА форуме уже была тема подобная - чото там проефект печатной машинки - поищите



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Июнь 15, 2016 13:01:18

Apxumekmop
Зарегистрирован: 2016-03-30
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Wake up, Neo или как выводить текст с эффектом "ввода с клавиатуры"

Спасибо, нашел, вот тема, если вдруг кому надо - 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 запись в файл будет произведена сразу-же.

Офлайн

#4 Июнь 15, 2016 13:08:21

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Wake up, Neo или как выводить текст с эффектом "ввода с клавиатуры"

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.

Офлайн

#5 Июнь 16, 2016 00:27:49

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Wake up, Neo или как выводить текст с эффектом "ввода с клавиатуры"

Есть несколько более улучшенная версия - с симуляцией разной скорости набора символов. Примерно так:

#!/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!')



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version