Используйте индикаторы GTK3 в Ruby - PullRequest
0 голосов
/ 04 июня 2018

Это мой код:

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 Ответ

0 голосов
/ 08 июня 2018

Интеграция цикла событий инструмента с графическим интерфейсом (Gtk, Tk и т. Д.) И Ruby раздражает начинающих, включая меня.Я знаю два способа.

1.add thread

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.use 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
...