From: Michael B. <be...@ju...> - 2014-08-17 19:57:42
|
Hi, I would like to download a series of images, and then the next one, not individual images. That way I get a broader selection of images (including older ones with the first download, newer ones later). I am including my current code below. I tried loading a second set of images after starting the auto_show, but the whole download is done before the first image is shown. Best Michael -snip- require 'gtk3' require 'open-uri' require 'tempfile' require 'flickraw' class RubyApp < Gtk::Window def initialize super signal_connect "destroy" do Gtk.main_quit end set_default_size 300, 200 maximize set_window_position Gtk::Window::Position::CENTER @pixbufs = [] @flickpixbufs = [] iswindow = true FlickRaw.api_key= FlickRaw.shared_secret= flickthread = Thread.new { flickresults = flickr.photos.search(:tags => "Tag", :per_page => 50) getimages(flickresults,"FlickRaw.url_b(currentresult)",@flickpixbufs) } # event handler signal_connect("key-press-event") do |_widget, event| case event.keyval when Gdk::Keyval::GDK_KEY_Right @pixbufs.push(@pixbufs.shift) update_image(@pixbufs.first) when Gdk::Keyval::GDK_KEY_Left @pixbufs.unshift(@pixbufs.pop) update_image(@pixbufs.first) when Gdk::Keyval::GDK_KEY_F11 if iswindow fullscreen iswindow = false else unfullscreen iswindow = true end end end flickthread.join @pixbufs = @flickpixbufs update_image(@pixbufs.first) auto_show(@pixbufs) end def getimages(resultarray, method, pixbufsarray) resultarray.each{|currentresult| image_path = Tempfile.open("display-web-image-in-gtk") do | tempfile| begin urlimage = open(eval(method)) rescue OpenURI::HTTPError => e puts e puts "cannot load image" break end tempfile.write(urlimage.read) tempfile.path end unless image_path.nil? fillpixbufs(image_path,pixbufsarray) end } end def fillpixbufs(image,dlpixbufs) begin currentpixbuf = Gdk::Pixbuf.new(image) rescue IOError => e puts e puts "cannot load images" exit end maxheight = 700 myheight = currentpixbuf.height if myheight > maxheight mywidth = currentpixbuf.width newwidth=(mywidth*(maxheight.to_f/myheight)).round currentpixbuf=currentpixbuf.scale(newwidth,maxheight,Gdk::Pixbuf::INTERP_BILINEAR) end puts image dlpixbufs << currentpixbuf end def auto_show(pixbufs) # auto mode GLib::Timeout.add(600) do @pixbufs.push(pixbufs.shift) update_image(pixbufs.first) true # continue end end def update_image(currentpixbuf) if (defined?(@gtkimage)).nil? @gtkimage = Gtk::Image.new :pixbuf => currentpixbuf add @gtkimage else @gtkimage.set_pixbuf(currentpixbuf) end show_all end end Gtk.init window = RubyApp.new Gtk.main -snip- Am Sonntag, den 17.08.2014, 14:21 +0200 schrieb Detlef Reichl: > Hi, > > I don't know, whats your code look like, but I would do it in this way: > > > Create a thread, that loads down the images. Every time, an image is > completely loaded a flag is set by the loader. Then it waits, that the > flag is unset. > > The display system has a Fifo, where it cycles over with a timeout. In > this timeout the loader flag is tested. If it is set, the image is > pushed into the Fifo and the flag is unset after this. > > Cheers, detlef > > > > Am 17.08.2014 00:13, schrieb Michael Below: > > Hi, > > > > I am working on the web display issue again. > > Now I would like to refresh the images. I.e.: > > > > - get a set of 50 images > > - display the first set, meanwhile get another set of 50 images > > - as soon as the second set is downloaded, and the first set has been > > shown at least once, switch from displaying first set to displaying > > second set > > - repeat infinitely > > > > Thanks to your help, I have got the code to display the first set of > > pictures in a loop like this: > > > > def auto_show(pixbufs) # auto mode > > GLib::Timeout.add(600) do > > @pixbufs.push(pixbufs.shift) > > update_image(pixbufs.first) > > true # continue > > end > > end > > > > I guess I could add a second Timeout that switches the picture sets > > every 5 minutes or so. But is there a way to change the picture sets > > after successfully loading the next one? > > > > I successfully moved the download process into a separate thread, but I > > can't get the download to run again and again while displaying images > > and updating the buffer. > > > > Cheers > > Michael > > > > > > Am Montag, den 26.05.2014, 08:46 +0200 schrieb Michael Below: > >> Hi, > >> > >> Am Montag, den 26.05.2014, 12:30 +0900 schrieb Masafumi Yokoyama: > >> > >>> A GTK window is just shown when `Gtk.main` is called. > >>> `show_all` sets flag to be displayed to all widgets, but doesn't > >>> actually display until `Gtk.main` is called. > >> > >> Ah, I understand... I even tried to move Gtk.main into my #each loop, > >> but this way it makes sense. > >> > >>> It seems that need to design such as the following: > >> > >> Thanks, works fine. > >> > >> Cheers > >> > >> Michael > > > > > > > > ------------------------------------------------------------------------------ > > _______________________________________________ > > ruby-gnome2-devel-en mailing list > > rub...@li... > > https://lists.sourceforge.net/lists/listinfo/ruby-gnome2-devel-en > > > > > ------------------------------------------------------------------------------ > _______________________________________________ > ruby-gnome2-devel-en mailing list > rub...@li... > https://lists.sourceforge.net/lists/listinfo/ruby-gnome2-devel-en |