8

I'm writing an app on Ubuntu 12.04 with Python and GTK 3. The problem I have is that I can't figure out how I should do to show a Gtk.Image in my app with an image file from the web.

This is as far as I have come:

from gi.repository import Gtk
from gi.repository.GdkPixbuf import Pixbuf
import urllib2

url = 'http://lolcat.com/images/lolcats/1338.jpg'
response = urllib2.urlopen(url)
image = Gtk.Image()
image.set_from_pixbuf(Pixbuf.new_from_stream(response))

I think everything is correct except the last line.

Daniel Jonsson
  • 3,261
  • 5
  • 45
  • 66

3 Answers3

16

This will work;

from gi.repository import Gtk
from gi.repository.GdkPixbuf import Pixbuf
from gi.repository import Gio
import urllib

url = 'http://lolcat.com/images/lolcats/1338.jpg'
response = urllib.request.urlopen(url)
input_stream = Gio.MemoryInputStream.new_from_data(response.read(), None)
pixbuf = Pixbuf.new_from_stream(input_stream, None)
image = Gtk.Image()
image.set_from_pixbuf(pixbuf)
Ahmed
  • 2,825
  • 1
  • 25
  • 39
BreinBaas
  • 391
  • 3
  • 11
2

I haven't found any documentation on PixBuf. Therefore, I can't answer which arguments new_from_stream takes. For the record, the error message I was given was

TypeError: new_from_stream() takes exactly 2 arguments (1 given)

But I can give you a simple solution which might even improve your application. Saving the image to a temporary file includes caching.

from gi.repository import Gtk
from gi.repository.GdkPixbuf import Pixbuf
import urllib2

url = 'http://lolcat.com/images/lolcats/1338.jpg'
response = urllib2.urlopen(url)
fname = url.split("/")[-1]
f = open(fname, "wb")
f.write(response.read())
f.close()
response.close()
image = Gtk.Image()
image.set_from_pixbuf(Pixbuf.new_from_file(fname))

I'm aware it's not the cleanest code (URL could be malformed, resource opening could fail, ...) but it should be obvious whats's the idea behind.

f4lco
  • 3,728
  • 5
  • 28
  • 53
2

I know it is an old question, but things have changed since and this is still the first Google hit.

This works for me in GTK 4, I am using requests, no temp file needed

import requests
from gi.repository import GLib, Gtk, Gdk, GdkPixbuf

response = requests.get(f'https://randomimage.com/image.png')
content = response.content

loader = GdkPixbuf.PixbufLoader()
loader.write_bytes(GLib.Bytes.new(content))
loader.close()

Gtk.Image.new_from_pixbuf(loader.get_pixbuf())
mijorus
  • 111
  • 1
  • 7