如何在Shoes中使用进度条?

sha*_*awn 1 ruby shoes progress-bar

好的,所以我不太确定鞋子里有很多东西,但到目前为止,我的试错方法在这个方面都没有让我失望.

我有一个类需要一段时间进行某种计算,我希望在完成时为用户提供一个进度条.如果传递一个块,我的计算密集型方法会产生完整百分比:

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
Run Code Online (Sandbox Code Playgroud)

这里要什么我喜欢的鞋说:

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
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.我已尝试使用/不使用窗口调用,我已尝试以各种方式使用animate(),我甚至尝试调用Thread.new并将其传递给窗口块,让它们通过Shoes.APPS()[0]进行交换./setPercent方法; 似乎没有什么工作正常.

也许我没有按照它的使用方式使用进度条.再说一次,进度条还有什么用呢?;-)

Pes*_*sto 5

首先,在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
Run Code Online (Sandbox Code Playgroud)