如何在ruby / tk中使用progressbar indeterminate?

时间:2013-04-30 10:42:49

标签: ruby progress-bar tk

我无法弄清楚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

1 个答案:

答案 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