如何使用在鞋的进度条?(How can I use the progress bar in Shoe

2019-09-26 09:06发布

好了,我不是真正的肯定很多事情在鞋,但我的尝试和错误的做法已经失败得那么远就这一个。

我有一个类,做某种计算需要一段时间,我想扔了用户看,才能完成一个进度条。 如果传递了一个块我的计算密集的方法产生的完成百分比:

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

但它似乎并没有工作。 我已经尝试使用/不使用的窗口呼叫,我试图以各种方式动画(),I甚至试图调用Thread.new并将其传递的窗口块,它们具有相反的经由Shoes.APPS()[0]。获得/ setPercent方法; 似乎没有正常工作。

也许我不使用进度条它的意思的使用方式。 再说,将一个进度条是什么? ;-)

Answer 1:

首先,在鞋两个窗口之间共享数据是一个皇家疼痛。 我不建议这样做。 取而代之的是,隐藏在第一窗口中的内容,并调出进度条在它的地方。

其次,我们将扩展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


Answer 2:

据我了解,像进度条需要被送入一个百分比值后重绘屏幕,这是你会在这种情况下使用什么动画的。

如果你只是想要做什么,你在你的问题已经说明,那么这个办法 - 虽然不是很灵活 - 不工作的例子。 但是,因为它从你的实际方法分离你的进步的逻辑,你只能前和运行这些方法后更改的百分比值。 所以,既然你只是运行一个迭代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

如果你的方法不只是重复同样的迭代做更多的,则是的,你会想从方法中经常产生其进度。 然后,为了同时它的运行从方法返回的进展,你可以把它放在一个单独的线程作为香草建议,只是轮询它在你的动画块的进展。 使用attr_accessor返回的比例也是一个不错的主意。 希望帮助。



文章来源: How can I use the progress bar in Shoes?