From: Detlef R. <det...@gm...> - 2014-08-18 16:39:08
|
Hi, I think, that it is a bug in current (ruby) gtk. Not even the example in the ruby-gnome source in ruby-gnome2/gtk3/sample/misc/hreads.rb runs as expected. Cheers, detlef Am 17.08.2014 21:56, schrieb Michael Below: > > 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 > > > > > ------------------------------------------------------------------------------ > _______________________________________________ > ruby-gnome2-devel-en mailing list > rub...@li... > https://lists.sourceforge.net/lists/listinfo/ruby-gnome2-devel-en > |