【问题标题】:Making a flashing console message with ruby使用 ruby​​ 制作闪烁的控制台消息
【发布时间】:2013-10-18 14:31:08
【问题描述】:
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 的命令提示符

【问题讨论】:

  • 有趣的代码..我一直在运行它..并享受输出:)
  • 您可能希望使用库来执行此操作,例如 curses,或者至少是 ANSI library。还要确保设置了STDOUT.sync = true。没有必要指定 STDOUT.print,因为 print 默认会这样做。
  • 对不起,如果这是一个初学者的问题,但我可以在不安装 gem 的情况下使用 curses 吗?默认情况下它是 ruby​​ 的一部分吗?
  • 不必使用STDOUT.print。默认情况下,printputs 都输出到 STDOUT。
  • 在打印花哨的东西之前,请确保 $stdout.isatty :)

标签: ruby


【解决方案1】:

或者,你可以使用这个

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

在控制台中使用text_flasher,你会看到神奇的:)

【讨论】:

  • 您必须在终端模拟器中启用闪烁文本,它通常被禁用。
  • 不能在 Windows 上运行,但可以在 Mac 和 Chakra/Ubuntu 上运行,无需做任何更改 :)
【解决方案2】:

通常会这样写:

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" 表示将托架返回到它的起始位置,在打字机上,它把滚轮一直向右移动,这样我们就可以再次在左边距开始打字了。带有移动头的打印机将其反转,并将打印头一直向左移动,但无论哪种情况,打印都会再次从左边距开始。使用控制台/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改成你想要的,代码会自动使用正确数量的空格来覆盖字符。

【讨论】:

  • 该死。比我的干净多了!
  • 这不是我第一次这样做。 :-) 使用 VT-52(或更新的)终端仿真器(例如大多数控制台)和内置的ANSI escape codes“blink”可以更简单地做到这一点。有关更多信息,请参阅“Colorized Ruby Output”。
【解决方案3】:

好的,根据@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)")

【讨论】:

    【解决方案4】:

    无论如何,退格键(至少在 Windows 中)看起来只是将光标向后定位,您需要/想要在该点(或其中 6 个)用空格覆盖字符以“空白”文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2016-04-16
      • 1970-01-01
      • 2014-08-30
      • 2022-01-01
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多