Ruby 如何在鞋子中使用进度条?
好的,所以我对鞋子里的很多东西都不是很确定,但是我的尝试和错误的方法到目前为止在这一点上失败了 我有一个类,它做一些计算,这需要一些时间,我想弹出一个进度条,让用户在完成时查看。如果通过一个块,我的计算密集型方法将产生其完成百分比:Ruby 如何在鞋子中使用进度条?,ruby,progress-bar,shoes,Ruby,Progress Bar,Shoes,好的,所以我对鞋子里的很多东西都不是很确定,但是我的尝试和错误的方法到目前为止在这一点上失败了 我有一个类,它做一些计算,这需要一些时间,我想弹出一个进度条,让用户在完成时查看。如果通过一个块,我的计算密集型方法将产生其完成百分比: class MathyStuff def initialize() end ## Some expensive, time consuming method which yields it's percent complete def expen
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方法;似乎没有什么能正常工作
也许我没有按预期的方式使用进度条。再说一遍,进度条还有什么用?;-) 首先,在鞋子里的两个窗口之间共享数据是一件非常痛苦的事情。我不推荐。相反,隐藏第一个窗口的内容,并在其所在位置显示进度条 其次,我们将扩展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
首先,在鞋子里的两个窗口之间共享数据是一件非常痛苦的事情。我不推荐。相反,隐藏第一个窗口的内容,并在其所在位置显示进度条 其次,我们将扩展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_访问器返回百分比也是一个好主意。希望这能有所帮助。据我所知,在输入百分比值后,进度条等内容需要重新绘制到屏幕上,这就是在本例中使用动画的目的 如果你只是想做你在问题中所说的,那么这种方法——虽然不是很灵活——确实适用于你的例子。但由于它将进度逻辑与实际方法分开,因此只能在运行这些方法之前和之后更改百分比值。所以,既然您只运行了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_访问器返回百分比也是一个好主意。希望有帮助。谢谢,这帮了大忙。似乎GUI编程,即使是在鞋子里,也需要一种不同的思考方式。我相信我很快就会回来问更多的问题!谢谢,这帮了大忙。似乎GUI编程,即使是在鞋子里,也需要一种不同的思考方式。我相信我很快就会回来问更多的问题!