2009-05-01 21 views
1

好的,所以我不確定鞋子上的很多東西,但是到目前爲止,我的試驗和錯誤方法已經失敗了。如何在鞋子中使用進度條?

我有一個類做了一些計算,需要一段時間,我想拋出一個進度條,讓用戶看完成。如果傳遞了一個塊我的計算密集的方法產生的完成百分比:

class MathyStuff 

    def initialize() 
    end 

    ## Some expensive, time consuming method which yields it's percent complete 
    def expensiveMethod(&block) 
    0.upto(100) do |i| 
     0.upto(100000) do |j| 
     k = j; 
     end 

     yield i.to_f/100; 
    end 
    end 

end 

這裏就是我想要的鞋說:

require 'MathyStuff.rb' 

Shoes.app do 

    @myMathyStuff = MathyStuff.new(); 

    button("Do expensive mathy thing...") do 
    window() do 
     @progress = progress(); 
     @myMathyStuff.expensiveMethod() {|percent| @progress.fraction = percent;} 
    end 
    end 

end 

但它似乎並沒有工作。我嘗試了/沒有窗口調用,我嘗試了各種方式的animate(),我甚至嘗試調用Thread.new並將它傳遞給窗口塊,讓他們通過Shoes.APPS()[0] .get/setPercent方法;似乎沒有任何工作正常。

也許我沒有按照它的意圖使用進度條。然後再一次,還有什麼進展吧? ;-)

回答

4

首先,在鞋子中的兩個窗口之間共享數據是一個皇家的痛苦。我不推薦它。相反,隱藏第一個窗口的內容並調出進度條。

其次,我們將擴展MathyStuff從處理模塊提供的百分比屬性打開它,所以我們可以從動畫線程訪問:

class MathyStuff 
    attr_accessor :percent 

    def expensiveMethodWrapper 
    @percent = 0.0 
    expensiveMethod {|x| @percent = x} 
    end 
end 

Shoes.app do 

    @myMathyStuff = MathyStuff.new(); 
    @window_slot = stack do 
    button("Do expensive mathy thing...") do 
     @window_slot.toggle 
     @progress_slot = flow do 
     @progress = progress :width => 1.0 
     end 
    end 
    Thread.new do 
     @myMathyStuff.expensiveMethodWrapper 
    end 
    @animate = animate do 
     @progress.fraction = @myMathyStuff.percent 
     if @myMathyStuff.percent == 1.0 
     @progress_slot.remove 
     @window_slot.toggle 
     @animate.stop 
     end 
    end 
    end 
end 
+0

謝謝,這有很大的幫助。看起來GUI編程,即使在Shoes中,也需要以不同的方式來思考事物。我很快會回覆更多的問題,我確信! – shawn 2009-05-02 21:05:22

3

據我瞭解,像進度在輸入一個百分比值後,需要重新繪製條形圖,這是你在這種情況下使用動畫製作的內容。

如果您只是想按照您在問題中陳述的內容進行操作,那麼這種方法 - 儘管不是非常靈活 - 對您的示例有效。但是因爲它將進度邏輯與實際方法分開,所以只能在運行這些方法之前和之後更改百分比值。所以,因爲你只是運行一次迭代100次,那麼你可以這樣做。

class Mathy 
    def foo 
    100000.times do |bar| 
     foo = bar 
    end 
    end 
end 

Shoes.app do 
    @mathy = Mathy.new 
    button("Run") do 
    @p = progress 
    animate do |percent| 
     break if percent > 100 
     @mathy.foo 
     @p.fraction = percent.to_f/100 
    end 
    end 
end 

如果你的方法是做不只是重複同樣的迭代多,那麼是的,你會想從方法中經常產生其進度。然後,爲了在方法運行時從方法中返回該進度,可以將其與Pesto建議的單獨線程一起放入一個單獨的線程中,然後在您的生成塊中輪詢它以獲取進度。使用attr_accessor返回百分比也是一個好主意。希望有所幫助。