1

我无法弄清楚 ruby​​/tk 中的进度条如何在不确定模式下工作。

我可以显示进度条,但它不会移动。

一个例子,如果我只是在我的代码中使用这一行

progressBar.start

如果我只有那条线,进度条将按应有的方式显示和移动。

但是如果我在它下面添加一行代码,它就不会执行。我的印象是进度条的 .start 方法会启动它,而方法 stop 会停止它,并且在您之间有应该执行的代码和进度条显示直到它看到停止。

但如果我这样做

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
4

1 回答 1

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

编辑:基于此处添加的问题,您的脚本的重新编写的更像 ruby​​ 的版本不幸的是,我不得不注释掉恶魔行,因为我无法让这个 gem 工作(加载错误)

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
于 2013-05-02T10:43:50.760 回答