首页 > 解决方案 > 如何重写打字机效果功能以使其适用于程序输出的任何文本?

问题描述

嘿,我已经有了打字机效果的代码。

import time,os,sys

message = "example"

def typewriter(message):
        for char in message:
            sys.stdout.write(char)
            sys.stdout.flush()

            if char!="\n":
                time.sleep(0.05)
            else:
                time.sleep(0.025)

os.system("cls") #clear
typewriter(message)

现在我只想粘贴到我的代码中一次并打印程序输出的任何文本,具有打字机效果,而不仅仅是消息。

标签: pythonpython-3.x

解决方案


您可以通过修补来做到这sys.stdout一点unittest.mock.patch

import sys
import time
from unittest import mock

class Typewriter:
    def write(self, message: str):
        for char in message:
            sys.__stdout__.write(char)
            sys.__stdout__.flush()

            if char != "\n":
                time.sleep(0.05)
            else:
                time.sleep(0.025)

@mock.patch('sys.stdout', new_callable=Typewriter)
def main(typewriter):
    print("Hello!")

main()

现在所有对它printmain调用或被调用的函数都main将使用Typewriter.write而不是常规的sys.stdout.write.

请注意,这是一个非常幼稚的实现,仅允许以打字机样式编写,但您将无法调用sys.stdout.flushfrom main,例如,因为Typewriter该类没有实现此方法。如果需要,您可以继承io.TextIOBase并实现缺少的方法。


或者,如果您只想复制和粘贴代码,您可以修补print函数本身:

def print(*args, file=Typewriter(), **kwargs):
    __builtins__.print(*args, file=file, **kwargs)

不过,所有这些都是非常可怕的黑客行为。你应该调用你的typewriter函数。

您应该为“正常工作”的所有内容粘贴什么

# Paste this at the very beginning of your file
import sys, time

class Typewriter:
    def write(self, message: str):
        for char in message:
            sys.stdout.write(char)
            sys.stdout.flush()

            if char != "\n":
                time.sleep(0.05)
            else:
                time.sleep(0.025)

def print(*args, file=Typewriter(), **kwargs):
    __builtins__.print(*args, file=file, **kwargs)

请注意,这将使所有调用都以print打字机效果输出内容。


推荐阅读