此脚本创建一个伪进度条:
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 *
。
两者都可以正常工作,但不能同时工作!如果我取消注释两个打印命令,我会打印两个条形图,只显示bar2
,bar1
不会显示一点都不。
我猜这是因为\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
进行测试,但我想要一个适用于大多数(如果不是全部)现代终端的解决方案。
答案 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执行各种操作!