Ruby GTK Pixbuf синхронизированное изменение изображения

Я создаю слайд-шоу изображений в ruby, используя gtk pixbuf для загрузки изображений. Я очень новичок в рубине и GTK, это может быть глупый вопрос.

В настоящее время изменения изображения связаны с button_press_event графического интерфейса, я бы хотел, чтобы они менялись/обновлялись автоматически в зависимости от установленного времени, например слайд-шоу или анимации. Я видел анимацию gtk с использованием метода gif, но я хотел бы использовать встроенную последовательность отдельных файлов jpeg, чтобы я мог установить время для показа слайда. После того, как цикл прошел через все изображения, графический интерфейс должен отображать кнопки для повторного воспроизведения или выхода. (Я еще не использовал @time, он просто для возможностей) Спасибо за любые предложения;

require 'gtk2'

class Pics
  attr_accessor :pile, :picindex, :imgLoaded, :image, :box, :window, :time

def initialize
  @window = Gtk::Window.new()
  @window.signal_connect("destroy"){Gtk.main_quit}
  pic1 = "1.jpg"
  pic2 = "2.jpg"
  pic3 = "3.jpg"
  pic4 = "4.jpg"
  @pile = [pic1, pic2, pic3, pic4]
  @picindex = 0
  self.getImage
  @box = Gtk::EventBox.new.add(@image)
  @time = true
end

def nuImage
  @box.remove(@image)
  @picindex = @picindex + 1
  @picindex = 0 if @picindex == @pile.length
  self.getImage
  @box.add(@image)
  @box.show
end

def getImage
  @imgLoaded = @pile[@picindex]
  img = Gdk::Pixbuf.new(@imgLoaded, 556, 900)
  @image = Gtk::Image.new(img)
  @image.show
end

end # class Pics

pics = Pics.new
  pics.box.signal_connect("button_press_event"){pics.nuImage}
  pics.window.set_default_size(556, 900)
  pics.window.add(pics.box)
  pics.window.show_all

Gtk.main

person user3648577    schedule 15.07.2014    source источник


Ответы (3)


используйте GLib.timeout_add() или GLib.timeout_add_seconds(). Верните False, если вы больше не хотите его использовать. Прочтите документацию GLib, раздел: Main Event Loop.

person luciomrx    schedule 17.07.2014
comment
Не могли бы вы привести пример работы в вышеуказанном контексте? - person user3648577; 18.07.2014

Это решение:

  def start_button__clicked(but)
    @thread = Thread.new { 
      loop do 
        next_button__clicked
        sleep(2) 
      end 
  end

  def stop_button__clicked(but)
    @thread.kill
  end

Вот как я бы сделал это в визуальном рубине. Это в основном то же самое.

У вас будет просто форма с кнопкой с именем «start_button» и «stop_button» и т. д.

person user1182000    schedule 14.07.2016

следующий код является реализацией:

GLib::Timeout.add(1000) do
  pics.nuImage if pics.time
  true
end

pics.window.signal_connect("key_press_event") do |_window, event|
  case event.keyval
  when Gdk::Keyval::GDK_KEY_space
    pics.time = !pics.time
  end
end

более подробная информация: http://ruby-gnome2.sourceforge.jp/hiki.cgi?GLib%3A%3ATimeout

person myokoym    schedule 07.08.2014