【问题标题】:Simultaneous progress bars同步进度条
【发布时间】:2015-09-29 18:03:18
【问题描述】:

此脚本创建一个伪进度条:

bar, bar2 = '', ''
10.times do |i|
  bar << '='
  bar2 << '**'
  print "#{bar} - #{i+1}0%\r"
  #print "#{bar2} - #{i+1}0%\r"
  sleep 0.3
end

10 = 在完成之前出现在屏幕的左下方。

我想同时创建两个加载栏。如您所见,我创建了bar2,它在完成之前创建了20 个*

两者都可以正常工作,但不能同时工作!如果我取消注释两个打印命令,我会打印两个条,只显示 bar2bar1 根本不显示。

我猜这是因为\r 将“光标”返回到行首,并用bar2 的进度覆盖bar

我尝试使用\n,但\n 之前的所有文本都不会被擦除。同样,这是因为 \r 是回车,不能在新行之前得到,所以虽然第一个循环实际上运行良好,但 bar 的进度(和 \n)停留在屏幕上,导致这个效果:

> = - 10%
> == - 20%
> === - 30%%
> ==== - 40%0%
> ===== - 50%40%
> ====== - 60% 50%
> ======= - 70%- 60%
> ======== - 80% - 70%
> ========= - 90%* - 80%
> ========== - 100%* - 90%

那么如何创建两个同时加载栏?或者实际上是无限数量的同时加载条?我正在gnome-terminal 进行测试,但我想要一个适用于大多数(如果不是全部)现代终端的解决方案。

【问题讨论】:

  • 你可能不得不使用类似ncurses 的东西来处理控制台光标。看起来有人已经做了一些可能接近你想要的东西,multiple_progress_bar。使用 ncurses。

标签: ruby terminal


【解决方案1】:

这是一个很酷的小问题。基本上,你做对了,你可以用\r 覆盖当前行。现在你只需要一个字符,它可以跳回上一行。您可以为此使用"\033[F"

bar, bar2 = '', ''
10.times do |i|
  bar << '='
  bar2 << '**'
  puts  "#{bar} - #{i+1}0%"
  print "#{bar2} - #{i+1}0%"
  print "\033[F\r"
  sleep 0.3
end

【讨论】:

    【解决方案2】:

    鉴于@ndn's answer 我认为它可能是系统和/或外壳特定的。我使用控制字符\033[1A 将光标向后移动了一行:

    # Tested on Mac & CentOS w/ Bash
    bar, bar2 = '', ''
    10.times do |i|
      bar << '='
      bar2 << '**'
      puts  "#{bar} - #{i+1}0%"
      print "#{bar2} - #{i+1}0%"
      print "\033[1A\r"
      sleep 0.3
    end
    

    你可以用这个page on Cursor Movement做各种事情!

    【讨论】:

    • 两者都适合我。 "\033[F" 版本不适合您吗?
    • @ndn 我认为它实际上可能是特定于外壳的。你在跑什么?
    • \033[F (cursor-preceding-line) 不是 VT100 的一部分,因此它在不同终端中的实现往往参差不齐(xterm 除外)。顺便说一句,bash 页面上的一些序列同样不是 VT100(光标保存/恢复)。那里关于 nxterm 的评论可以追溯到 1990 年代后期(应该有人维护该页面)。
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多