同步进度条

时间:2015-09-29 18:03:18

标签: ruby terminal

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

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将“光标”返回到行的开头,并在bar的进度中覆盖bar2

我尝试过使用\n,但\n之前的所有文字都没有被删除。同样,这是因为\r是在新行之前无法获得的回车符,所以当第一个循环实际上完美运行时,bar的进度(和\n)保持不变在屏幕上,造成这种影响:

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

鉴于@ndn's answer我认为它可能是系统和/或shell特定的。我使用控制字符\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执行各种操作!