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