我想制作一个从字符串中读取字符的程序,并在延迟一段时间后打印每个字符,使其看起来像打字效果。
现在我的问题是睡眠功能无法正常工作。长时间拖延后打印整句。
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”删除字符之间的空格。
答案 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")