簡體   English   中英

如何使用“鞋”中的進度欄​​?

[英]How can I use the progress bar in Shoes?

好的,所以我對鞋類中的許多內容不確定,但是到目前為止,我的嘗試和錯誤方法在這方面使我失敗了。

我有一個類,它需要一段時間才能進行某種計算,並且我想拋出一個進度條,供用戶在完成時查看。 如果通過一個塊,我的計算密集型方法將產生其完成百分比:

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方法; 似乎沒有任何工作正常。

也許我沒有按原本打算的方式使用進度條。 再說一次,進度條還有什么用? ;-)

首先,在Shoes中的兩個窗口之間共享數據是一件很麻煩的事。 我不推薦。 而是隱藏第一個窗口的內容,並在其位置調出進度欄。

其次,我們將擴展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

據我了解,進度欄之類的東西需要輸入百分比值后才需要重新繪制以顯示在屏幕上,在這種情況下,這就是您要使用動畫的目的。

如果您只想按照問題中的說明去做,那么這種方法(雖然不是很靈活)確實可以用於您的示例。 但是,由於它將進度邏輯與實際方法分開,因此只能在運行這些方法之前和之后更改百分比值。 因此,由於您僅運行一次迭代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返回百分比也是一個好主意。 希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM