在 Ruby 中使用 GTK3 进度条

Posted

技术标签:

【中文标题】在 Ruby 中使用 GTK3 进度条【英文标题】:Use GTK3 progress bars in Ruby 【发布时间】:2018-06-03 21:26:22 【问题描述】:

这是我的代码:

require "gtk3"
builder_file = "#File.expand_path(File.dirname(__FILE__))/example.ui"
builder = Gtk::Builder.new(:file => builder_file)
window = builder.get_object("window")
window.signal_connect("destroy")  Gtk.main_quit 
progressbar=builder.get_object("progressbar1")
progressbar.set_fraction(0.5)
button = builder.get_object("button1")
button.signal_connect("clicked") 
  for i in(0..4)
    sleep(1)
    puts "query " + (i+1).to_s + " done"
    a=(i+1)/5.to_f
    puts a
    progressbar.set_fraction(a)
  end
  
Gtk.main

sleep 只是一个占位符,用于大约需要 1 秒的网络查询。当我在我的机器上执行此代码时,控制台输出很好,但进度条保持空白,直到它在五秒后跳到满,这不是我想要的。如何使用进度条?

【问题讨论】:

【参考方案1】:

GUI 工具(Gtk、Tk 等)和 Ruby 的事件循环的集成让包括我在内的初学者很恼火。我知道两种方法。

1.添加线程

require 'gtk3'

win = Gtk::Window.new('Sample')
win.signal_connect('destroy')  Gtk.main_quit 

box = Gtk::Box.new(:vertical)

pb = Gtk::ProgressBar.new
pb.set_fraction(0.5)

b = Gtk::Button.new(label: 'Button')
b.signal_connect('clicked') do
  Thread.new do
    5.times do |i|
      sleep 1
      pb.fraction = (i + 1) / 5.0
    end
  end
end

win.add box
box.pack_start pb
box.pack_start b

win.show_all

Gtk.main

2.使用 GLib::Timeout

b.signal_connect('clicked') do
    i = 0.0
    GLib::Timeout.add(1000) do |a|
           i += 0.2
           pb.fraction = i
           i < 1.0 # return false and stop when i >= 1.0
    end
end

【讨论】:

以上是关于在 Ruby 中使用 GTK3 进度条的主要内容,如果未能解决你的问题,请参考以下文章

ruby 使用Ruby的没有Gem的简单进度条脚本。

使用引导进度条的 Rails 动态数据进度条

关于VB.NET中进度条使用问题

长按如何使进度条变化Android

VB怎么制作进度条?

android 怎么自定义绘制如下图中这种进度条