我想要一个File.open('somefile', 'w+')
,让它读取一个文件,一次读取一行文本,然后在另一个文件中缓慢地可视化写入。我之所以问这个问题,是因为我在代码中找不到任何可以做到这一点的东西,也找不到真正控制程序在计算机上写入速度的东西。我知道,只要你在角色后面提供一个光标,视觉效果不会发生得太快,这可以在Adobe Aftereffect这样的程序中进行模拟,但我有4000行代码想要迭代,无法手动完成。这种效果也可以通过Microsoft宏来实现,但这需要手动将其输入到宏中,而无需复制和粘贴选项。
-Python、Ruby和PHP中首选的解决方案-
如果我正确理解了你想要实现的目标,那么就来吧:
input = File.read('readfrom.txt', 'r')
File.open('writeto.txt', 'w+') do |f|
input.chars.each do |c|
f.print(c) # print 1 char
f.flush # flush the stream
sleep 1 # sleep
end
end
这是Python中一种快速而肮脏的方法。
from time import sleep
mystring= 'My short text with a newline here'nand then ensuing text'
dt = 0.2 #0.2 seconds
for ch in mystring:
with open('fn_out','w+') as f:
f.write(ch)
f.flush()
sleep(dt)
f.flush()
将导致使用更改更新文件。
可以通过在每条换行后有更长的停顿或可变的时间步长dt
来使这一点更加复杂。
如@Tom Lord所指出的,要观看更改,必须反复重新加载文件,这样你就可以提前运行这样的程序在终端中观看:
watch -n 0.1 cat fn_out
经过一些认真的测试,我终于开发出了一段代码,可以做我想要的事情。Tom Lord给了我一些新词,让我在搜索词"模拟打字"中使用,这让我找到了具有SendKeys
功能的win32ole
。这是一个代码,它将迭代文件中的所有字符,并在模拟键入时将它们打印出来。我会考虑把它做成一块宝石以备将来使用。
require 'win32ole'
wsh = WIN32OLE.new("WScript.Shell")
wsh.Run("Notepad.exe")
while not wsh.AppActivate("Notepad")
sleep 1
end
def fileToArray(file)
x = []
File.foreach("#{file}") do |line|
x << line.split('')
end
return x.flatten!
end
tests = fileToArray("readfrom.txt")
x = 0
while x <= tests.length
send = tests[x]
wsh.SendKeys("#{send}")
x += 1
sleep 0.1
end