强制语句以可视方式缓慢地写入文件


Force a statement to visually write to a file slowly

我想要一个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