在Python中键入效果

时间:2013-11-30 16:01:43

标签: python python-2.7 sleep

我想制作一个从字符串中读取字符的程序,并在延迟一段时间后打印每个字符,使其看起来像打字效果。

现在我的问题是睡眠功能无法正常工作。长时间拖延后打印整句。

import sys
from time import sleep

words = "This is just a test :P"
for char in words:
    sleep(0.5)
    sys.stdout.write(char)

我使用“sys.stdout.write”删除字符之间的空格。

7 个答案:

答案 0 :(得分:5)

每次迭代后都应该使用sys.stdout.flush()

问题是stdout是用换行符刷新的,还是用sys.stdout.flush()

手动刷新

结果是

import sys
from time import sleep

words = "This is just a test :P"
for char in words:
    sleep(0.5)
    sys.stdout.write(char)
    sys.stdout.flush()

缓冲输出的原因是需要执行系统调用以进行输出,系统调用既昂贵又耗时(因为上下文切换等)。因此,用户空间库会尝试缓冲它,如果需要,您需要手动刷新它。

仅为了完整性...错误输出通常是非缓冲的(调试很困难)。所以下面也会奏效。重要的是要意识到它被打印到错误输出。

import sys
from time import sleep

words = "This is just a test :P"
for char in words:
    sleep(0.5)
    sys.stderr.write(char)

答案 1 :(得分:2)

你必须在每个循环中刷新stdout,以清空缓冲区:

import sys

from time import sleep

words = "This is just a test :P\n"
for char in words:
    sleep(0.5)
    sys.stdout.write(char)
    sys.stdout.flush()

如果没有这个,它只是将你的字符串存储在缓冲区中并等待\n(或打印足够数量的字符),这将在循环结束时出现....

更多信息:

答案 2 :(得分:1)

python 3 中,您可以使用标准sys.stdout来电替换print的来电:

for char in words:
    sleep(0.1)
    print(char, end='', flush=True)

答案 3 :(得分:0)

import sys
from time import sleep

words = "Welcome to CB#SA.NET.CO"
for char in words:
sleep(0.1)
sys.stdout.write(char)
sys.stdout.flush()

答案 4 :(得分:0)

长答案:

import sys
import time

variable_name = 'Words'

for char in variable_name:
    time.sleep(0)
    sys.stdout.write(char)
  

为什么需要冲洗方法?没有它,我的代码就可以工作。

简短答案:

import time

variable_name = 'Words'

for char in variable_name:
    time.sleep(0)
    print(char, end = '')
  

如果您希望单词垂直打印,则应省略end参数。

     

如果您希望单词水平打印,则应使用end参数。

     

无论哪种方式,代码都可以在不使用flush方法的情况下工作。

答案 5 :(得分:0)

为了简化操作,应放置sys.stdout.flush和def函数。例如:

    import sys
    import time

    def print_slow(str):
        for char in str:
            time.sleep(.1)
            sys.stdout.write(char)
            sys.stdout.flush()

print_slow('Hello')

这应该有效,因为我已经对其进行了测试。 def使编写字符串变得更加容易,您可以根据需要自定义它。 (:

答案 6 :(得分:0)

我对@Jon Vorcak有类似的答案,

我们使用一个带有他代码的函数

#you can also call it whatever you want
def type(text):
  words = text
  for char in words:
    time.sleep(0.2)
    sys.stdout.write(char)
    sys.stdout.flush()
type("hi")