使用ruby制作闪烁的控制台消息

时间:2013-10-10 17:30:48

标签: ruby

0.upto(9) do
    STDOUT.print "Flash!"
    sleep 0.5
    STDOUT.print "\b\b\b\b\b\b" # (6 backspaces, the length of "Flash!")
    sleep 0.5
end

此代码不起作用。它会将Flash!打印到屏幕上,但它不会闪烁。它只是停留在那里,好像退格还没有生效。但我这样做:

0.upto(9) do
    STDOUT.print "Flash!"
    sleep 0.5
    STDOUT.print "\b\b\b\b\b" # (5 backspaces, the length of "Flash! - 1")
    sleep 0.5
end

它几乎可以工作。它打印出这个:FFFFFFFFFFlash!(在9个循环之后)为什么当它们的数量等于它们要删除的字符串的长度时,退格会停止生效?

如何才能克服此问题并创建闪烁消息,仅使用属于rails的库?

我尝试了这样的解决方法:

0.upto(9) do
    STDOUT.print " Flash!"
    sleep 0.5
    STDOUT.print "\b\b\b\b\b\b"
    sleep 0.5

end

(请注意" Flash!"中的空格),但会出现的情况是消息似乎在屏幕上爬行!一个有趣的效果,但不是我想要的。

我在Windows 7中使用命令提示符和Ruby和Rails

4 个答案:

答案 0 :(得分:5)

通常这会写成:

0.upto(9) do
  STDOUT.print "\rFlash!"
  sleep 0.5
  STDOUT.print "\r      " # Send return and six spaces
  sleep 0.5
end

回到我们与TTY和点阵式打印机交谈的日子里,我们很快习惯了马车控制字符,比如“\ r”,“\ n”,“\ t”等等。今天,人们很少这样做,因为他们想要使用网络和浏览器;学习与设备交谈的时间很晚。

“\ r”表示将托架返回原位,在打字机上将滚轮一直向右移动,这样我们就可以再次开始在左边缘打字。带有移动头的打印机将打印头颠倒过来,并将打印头一直向左移动,但是,无论哪种情况,都会在左边缘再次打印。使用console / telnet / video-TTY,它将光标移动到左边距。它完全相同,只是技术不同。


更有用的例程是:

msg = 'Flash!'

10.times do
  print "\r#{ msg }"
  sleep 0.5
  print "\r#{ ' ' * msg.size }" # Send return and however many spaces are needed.
  sleep 0.5
end

msg更改为您想要的内容,代码将自动使用正确数量的空格来覆盖字符。

答案 1 :(得分:2)

无论如何,它看起来像退格(至少在窗口中)只是将光标定位回来,你需要/想要用该点(或其中的6个)用空格覆盖该字符以“清空”文本。 / p>

答案 2 :(得分:2)

或者,你可以使用这个

def text_flasher(text)
    puts "\e[5m#{text}\e[0m"
end

在控制台中使用text_flasher,您将看到魔术:)

答案 3 :(得分:1)

是的,根据@rogerdpack的输入,我设计了一个解决方案:

def flashing_output(output)
    message = output
    backspace = "\b"
    space = " "

    backspace_array = []
    space_array = []  

    length = message.length

    length.times do
        backspace_array << backspace
        space_array << space
    end    

    0.upto(9) do
        print message
        sleep 0.5
        print backspace_array.join.to_s + space_array.join.to_s + backspace_array.join.to_s + backspace_array.join.to_s
        sleep 0.5
    end
end

flashing_output("Flashing Foobars! (not a euphemism)")