我无法弄清楚ruby / tk中的进度条如何在不确定模式下工作。
我可以显示进度条,但不会移动。
一个例子,如果我只在我的代码中使用这一行
progressBar.start
如果我只有那条线,那么进度条就会显示并移动它。
但如果我在它下面添加一行代码就不会执行。我的印象是进度条的.start方法启动它,方法停止它,并且在它之间你有应该执行的代码和进度条显示,直到它看到停止。
但如果我这样做
progressBar.start
# some code (a loop that takes a long while to execute)
progressBar.stop
在中间的代码完成之前,进度条没有显示?我以为这就是你想要进度条的原因?
我在这里不理解。
你帮忙但是为什么这不起作用。这只是一个愚蠢的考验。但我在真实的节目中做了类似的事情。如果我编写此代码,进度条将不会按预期运行,而是在Devil img循环完成后运行?
Dir.chdir("c:/temp")
bilder = Dir.glob("*.jpg")+
bilder = Dir.glob("*.png")+
bilder = Dir.glob("*.gif")
puts bilder
root = TkRoot.new { title 'Progressbar Demo' }
content = Tk::Frame.new(root) {}.grid(:sticky =>'new')
progress = Tk::Tile::Progressbar.new(content:mode=>'indeterminate':orient=>:horizontal)
progress.pack
Thread.new do
progress.start
i=0
while i < bilder.length
Devil.with_image(bilder[i]) do |img|
img.thumbnail2(150)
img.save("thumbnail_"+ bilder[i])
end
i=i+1
end
progress.stop
end
Tk.mainloop
答案 0 :(得分:3)
这是一个线程问题。 这段代码应该有效。在Win7上测试,Ruby 1.9.3
require 'tk'
root = TkRoot.new { title 'Progressbar Demo' }
progress = Tk::Tile::Progressbar.new(root, :mode=>'determinate', :orient=>:horizontal, :maximum=>100)
progress.pack
Thread.new do
99.times do |i|
progress.step(1) #or progress.value = i
puts i
sleep 0.1
end
end
Tk.mainloop
对于您的
的不确定版本require 'tk'
root = TkRoot.new { title 'Progressbar Demo' }
progress = Tk::Tile::Progressbar.new(root, :mode=>'indeterminate', :orient=>:horizontal)
progress.pack
Thread.new do
progress.start
99.times do |i|
puts i
sleep 0.1
end
progress.stop
end
Tk.mainloop
这里有一个如何用绿鞋做的例子
require 'green_shoes'
Shoes.app do
@p = progress
@animate = animate do |percent|
@animate.stop if percent > 99
puts percent
@p.fraction = percent.to_f / 100
end
end
编辑:基于这里添加的问题,重新编写了更多rubylike版本的脚本 不幸的是我不得不评论魔鬼线因为我无法让这个宝石工作(loaderror)
require 'tk'
# require 'devil'
bilder = Dir['c:/temp/*.{jpg,png,gif}']
root = TkRoot.new { title 'Progressbar Demo' }
progress = Tk::Tile::Progressbar.new(root, :mode=>'indeterminate', :orient=>'horizontal')
progress.pack
STDOUT.sync = true
Thread.new do
progress.start
bilder.each do |bild|
puts bild
sleep 0.5
# Devil.with_image(bild) do |img|
# img.thumbnail2(150)
# img.save("thumbnail_#{bild}")
# end
end
progress.stop
end
Tk.mainloop
最后编辑:
这里有一个mini_magick的工作示例,因为恶魔不能在我的任何一台电脑上工作并且给TK带来问题
['mini_magick','tk','fileutils'].each(&method(:require))
bilder = Dir['c:/test/*.{jpg,png,gif}']
root = TkRoot.new { title 'Progressbar Demo' }
progress = Tk::Tile::Progressbar.new(root, :mode=>'indeterminate', :orient=>'horizontal')
progress.pack
STDOUT.sync = true
def generate file, out, type
image = MiniMagick::Image.open file
if type == :thumb
image.resize "92x92"
elsif type == :slide
image.resize "800x600"
end
image.write out
end
Thread.new do
progress.start
bilder.each do |bild|
puts bild
generate bild, bild+'.thumb.jpg', :thumb
end
progress.stop
progress.destroy
end
Tk.mainloop