2013-04-30 120 views
1

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

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

一个例子,如果我只是用这条线在我的代码

progressBar.start 

如果我只有该行的进度将展示动人的,因为它应该。

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

但如果我这样做

progressBar.start 
# some code (a loop that takes a long while to execute) 
progressBar.stop 

没有beeing显示的进度,直到之间的代码完成?我以为这就是你想要进度条的原因?

我在这里不理解什么。


Thx对你有帮助,但为什么不能正常工作。它只是一个愚蠢的测试。但我在真正的节目中做了类似的事情。如果我编写这段代码,进度条将不会运行,而是在魔鬼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

请添加运行一个完整的示例,并显示给问题你的问题。 – 2013-04-30 11:03:35

+0

我敢打赌问题是在处理代码期间没有运行事件循环... – 2013-05-02 10:31:02

回答

3

这是一个线程问题。 这段代码应该可以工作。经测试Win7上,红宝石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 

为了您indeerminate版本是

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 
+0

嗨,Thx我会尝试,但似乎很奇怪,我不得不为此使用线程?那么当进度条显示时,我想要做的只是在一个新的线程中? – MaestroGarcia 2013-05-02 13:09:41

+0

形式上,您只需要不时调用update(注意,由于重入问题,这实际上并不重要),以便允许处理定时器事件。我不太清楚在Ruby/Tk中如何做到这一点。 (尽管如此,线程实际上可能更容易。) – 2013-05-02 14:51:59

+0

更新不起作用,也许它在早期版本的Ruby/Tk或Ruby中执行,如果您从另一个Tk元素(如不需要该线程的按钮)执行该步骤,并且如果您喜欢它,那么简单可以使用green_shoes,如果你喜欢我也发布一个例子 – peter 2013-05-02 15:27:54