Как напечатать строку с небольшой задержкой между символами?

#python

#python

Вопрос:

Я хочу, чтобы текст отображался так, как если бы он только набирался. Поэтому мне нужна небольшая задержка после каждой буквы.

Я пытался сделать это таким образом:

 import time

text = "Hello, this is a test text to see if all works fine."
for char in text:
   print char,time.sleep(0.2),
  

Это работает нормально, за исключением одной проблемы. Я получаю «Нет» после каждого символа.

Это вывод:

 H None e None l None l None o None , None   None t None h None i None s None   None i None s None   None a None   None t None e None s None t None   None t None e None x None t None   None t None o None   None s None e None e None   None i None f None   None a None l None l None   None w None o None r None k None s None   None f None i None n None e None . None
  

Я не знаю, почему это происходит. Я надеюсь, что кто-нибудь может мне помочь.

Комментарии:

1. Почему вы печатаете значение time.sleep(0.2) ?

Ответ №1:

 >>> import time
>>> import sys
>>> blah = "This is written slowlyn"
>>> for l in blah:
...   sys.stdout.write(l)
...   sys.stdout.flush()
...   time.sleep(0.2)
...
This is written slowly
  

Комментарии:

1. 1 для flush() . Конечно, если вы действительно хотите, чтобы она выглядела напечатанной, время пауз должно быть случайным; кто печатает в совершенно регулярном темпе?

2. Зависит от машинистки. Машинистки с сенсорными клавишами: задержка будет больше между одними и теми же клавишами.. и, вероятно, самый короткий между чередующимися раздачами. Более длительная задержка для сдвига и т. Д. Я начал что-то кодировать, но потом решил вернуться к работе 🙂

3. @Wooble Это зависит. Например, я обычно печатаю с более или менее регулярной скоростью (…) со случайными перерывами (…), чтобы подумать о том, что я собираюсь вводить дальше.

Ответ №2:

Вы печатаете результат time.sleep(0.2) , который есть None . Переместите ее на следующую строку.

 text = "Hello, this is a test text to see if all works fine."
for char in text:
    print char,
    time.sleep(0.2)
  

Конечно, у вас все еще есть проблема с пробелом между каждым символом, которую можно решить, заменив print оператор вызовом to sys.stdout.write .

 text = "Hello, this is a test text to see if all works fine."
for char in text:
    sys.stdout.write(char)
    time.sleep(0.2)
  

Комментарии:

1. Для Python 3 используйте print(char, end="", flush=True) в 1-м примере.

Ответ №3:

Поместите time.sleep в отдельную строку. С запятой вы также печатаете ее возвращаемое значение.

Ответ №4:

Вы печатаете возвращаемое значение time.sleep(0.2), которое равно None . Поместите это в отдельную строку. Запятая после «print char» предотвратит печать новой строки, но она введет один пробел после каждого символа.

Попробуйте это вместо:

 >>> import sys
>>> import time
>>> text = "Hello, this is a test text to see if all works fine."
>>> for char in text:
...     sys.stdout.write(char)
...     time.sleep(0.2)
  

Комментарии:

1. MattH опередил меня и также правильно включил вызов flush() .

Ответ №5:

Я думаю, что ваш пример печатает их все в отдельных строках (по крайней мере, в Windows). Вы можете использовать печать sys.stdout , чтобы обойти это.

 import time, sys
for character in text:
    sys.stdout.write(character)
    time.sleep(0.2)
  

Ответ №6:

эта строка:

 print char, time.sleep(0.2)
  

расшифровывается как «выведите значение char , а затем выведите возвращаемое значение функции time.sleep() (которое есть None )».

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

 >>> import sys
>>> import time
>>> for char in "test stringn":
...    sys.stdout.write(char)
...    time.sleep(0.2)
...
test string
>>>
  

Ответ №7:

Спасибо всем за вашу помощь, это мой окончательный код, я произвольно рассчитал время задержки, как упоминал Wooble:

 import time
import sys
from random import randrange

text = "This is the introduction text."

for c in text:
    sys.stdout.write(c)
    sys.stdout.flush()
    seconds = "0."   str(randrange(1, 4, 1))
    seconds = float(seconds)
    time.sleep(seconds)