python - 如何重写打字机效果功能以使其适用于程序输出的任何文本?
问题描述
嘿,我已经有了打字机效果的代码。
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)
现在我只想粘贴到我的代码中一次并打印程序输出的任何文本,具有打字机效果,而不仅仅是消息。
解决方案
您可以通过修补来做到这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()
现在所有对它print
的main
调用或被调用的函数都main
将使用Typewriter.write
而不是常规的sys.stdout.write
.
请注意,这是一个非常幼稚的实现,仅允许以打字机样式编写,但您将无法调用sys.stdout.flush
from 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
打字机效果输出内容。
推荐阅读
- junit - 如何在 Java 中导入“@Test”方法
- javascript - 从 innerHTML 中仅删除文本
- firebase - Xamarin Firebase Cloud 消息间歇性不起作用
- jquery - DataTables将排序图标放在指定为没有的列上
- django - 在 Docker 中使用 Django 无法获取 rest api
- flutter - 如何在 GridView 中每 6 个不同的项目渲染一个图像?
- reactjs - 使用到达路由器检测路由是否是初始页面加载?
- c# - 如何从 .py 文件中读取代码作为 C# 中的字符串?
- python - Django:如何通过唯一约束字段的验证以更新模型记录
- javascript - 反应导航向我发送此错误:路由路由器的组件必须是反应组件