2012-04-21 89 views
12

打印的ASCII紡「光標」我有一個Ruby腳本,做一些長期服用的工作。它只是命令行,我想表明該腳本仍在運行,不會停止。過去我習慣於喜歡所謂的「旋轉光標」,並在Windows下的Ruby中設法重現它。在控制檯

問:做這項工作中的其他OS的?如果沒有,是否有一種操作系統無關的方式來實現這一目標?

沒有IRB的解決方案吧。

10.times { 
    print "/" 
    sleep(0.1) 
    print "\b" 
    print "-" 
    sleep(0.1) 
    print "\b" 
    print "\\" 
    sleep(0.1) 
    print "\b" 
    print "|" 
    sleep(0.1) 
    print "\b" 
} 
+2

這將在所有重要的操作系統工作,我知道的,除非打印字符發生導致換行。 – 2012-04-21 19:28:22

+1

適用於Linux,Ruby 1.8.7 ... – 2012-04-21 19:28:24

+8

順便說一下,這相當於'('/ - \\ |'* 10).each {| c |打印c;睡眠(0.1);打印「\ b」}' – 2012-04-21 19:30:31

回答

34

是的,這適用於Windows,Mac OS X和Linux。提高由Niklas'的建議,可以讓這個更一般像這樣:

def show_wait_spinner(fps=10) 
    chars = %w[|/- \\] 
    delay = 1.0/fps 
    iter = 0 
    spinner = Thread.new do 
    while iter do # Keep spinning until told otherwise 
     print chars[(iter+=1) % chars.length] 
     sleep delay 
     print "\b" 
    end 
    end 
    yield.tap{  # After yielding to the block, save the return value 
    iter = false # Tell the thread to exit, cleaning up after itself… 
    spinner.join # …and wait for it to do so. 
    }    # Use the block's return value as the method's 
end 

print "Doing something tricky..." 
show_wait_spinner{ 
    sleep rand(4)+2 # Simulate a task taking an unknown amount of time 
} 
puts "Done!" 

def show_wait_cursor(seconds,fps=10) 
    chars = %w[|/- \\] 
    delay = 1.0/fps 
    (seconds*fps).round.times{ |i| 
    print chars[i % chars.length] 
    sleep delay 
    print "\b" 
    } 
end 

show_wait_cursor(3) 

如果你不知道這個過程會有多長時間,你可以在另一個線程這樣做這一次輸出:從彼得

Doing something tricky...| 
Doing something tricky.../ 
Doing something tricky...- 
Doing something tricky...\ 
(et cetera) 
Doing something tricky...done! 
+0

哇Phrogz,這是美麗的,媒體鏈接解決了大多數的實施。你在WOL上的表現如何,你能測試它嗎?你有虛擬機或者你如何測試它? – peter 2012-04-21 22:10:54

+0

@peter您在Windows上測試過;我在OS X和Ubuntu上測試過。 – Phrogz 2012-04-21 22:18:07

+0

@peter請注意,我更新了線程代碼,使其更簡單和更清晰。 – Phrogz 2012-04-22 03:36:19

4
# First define your chars 
pinwheel = %w{|/- \\} 

# Rotate and print as often as needed to "spin" 
def spin_it 
    print "\b" + pinwheel.rotate!.first 
end 

編輯:這裏的工作版本

def spin_it(times) 
    pinwheel = %w{|/- \\} 
    times.times do 
    print "\b" + pinwheel.rotate!.first 
    sleep(0.1) 
    end 
end 

spin_it 10 
+1

thnx您的貢獻傑森,但你有沒有測試過?它不工作在W7上的ruby193 – peter 2012-06-01 17:35:32

+1

使它工作,不斷髮布! – peter 2012-06-01 19:12:23

+1

'陣列#旋轉!'是漂亮的 – Julik 2014-07-30 21:01:56

3

我寫了一個gem spin_to_win,顯示一個微調器,同時產生一個塊。例如:

SpinToWin.with_spinner('Zzzz') do |spinner| 
    spinner.banner('sleepy') 
    sleep 1 
end 
Zzzz \ [sleepy] 

它還可以跟蹤工作的未決對完成的工作:

SpinToWin.with_spinner('Zzzz') do |spinner| 
    spinner.increment_todo!(3) 

    spinner.banner('snore') 
    sleep 1 
    spinner.increment_done! 

    spinner.banner('dream') 
    sleep 1 
    spinner.increment_done! 

    spinner.banner('wake up!') 
    sleep 1 
    spinner.increment_done! 
end 
Zzzz \ 3 of 3 [wake up!] 
+0

Thnx,我在安裝好你的寶石(沒有錯誤)後嘗試了你的例子,但兩者都出錯(我在win7,MRI Ruby 1.9.3上) C:/ .. /console/spin_to_win1.rb:8:語法錯誤,意外的$ undefined,期待$ end Zzzz \ [sleepy] ^ – peter 2016-03-06 22:16:29

+0

啊,應該清楚最後一部分是微調的輸出。 – mguymon 2016-03-07 03:08:01