2

我正在 ruby​​ 中创建图像幻灯片,使用 gtk pixbuf 加载图像。我对 ruby​​ 和 GTK 很陌生,这可能是一个愚蠢的问题。

当前图像更改与 GUI button_press_event 相关联,我希望它们根据设定的时间自动更改/刷新,例如幻灯片或动画。我用gif方法看到了gtk动画,但是我想使用单独的jpeg文件内联序列,这样我就可以设置显示幻灯片的时间。一旦循环遍历了所有图像,GUI 应该会显示用于重播或退出的按钮。(我还没有使用@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
4

3 回答 3

2

使用 GLib.timeout_add() 或 GLib.timeout_add_seconds()。如果您不想再使用它,则返回 False。阅读 GLib 文档,部分:主事件循环

于 2014-07-17T05:37:53.307 回答
1

这是一个解决方案:

  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”等按钮的表单。

于 2016-07-14T06:31:16.493 回答
0

以下代码是一个实现:

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

于 2014-08-07T04:55:51.103 回答