[Python-es] Poner imagen de fondo en un contenedor

Iñigo Serna inigoserna en gmail.com
Sab Ene 14 18:35:57 CET 2012


Buenas,

2012/1/14 Jose Sanchez <jose.sanchez86 en hotmail.es>:
> ¿Como se podría poner una imagen de fondo en un contenedor?
>
> Da igual el tipo que sea:
> gtk.EventBox(), gtk.HBox() o gtk.VBox.
> Con que en uno de ellos se pueda suficiente.

Para gtk+ v2.x tienes la respuesta en:
http://faq.pygtk.org/index.py?req=all#8.21

Copio el código:
##########################################################################
pixbuf = gtk.gdk.pixbuf_new_from_file("/path/to/img.png")

def expose(widget, event, pixbuf):
    widget.window.draw_pixbuf(widget.style.bg_gc[gtk.STATE_NORMAL],
pixbuf, 0, 0, 0, 0)
    if widget.get_child() is not None:
        widget.propagate_expose(widget.get_child(), event)
    return True

win = gtk.Window()
win.set_size_request(768, 32)
win.connect("delete-event", gtk.main_quit)

evbox = gtk.EventBox()
evbox.connect('expose_event', expose, pixbuf)

hbox = gtk.HBox(False, 10)
l1 = gtk.Label("tururu 1")
hbox.pack_start(l1, True, True, 0)
l2 = gtk.Label("tururu 2")
hbox.pack_start(l2, True, True, 0)
l3 = gtk.Label("tururu 3")
hbox.pack_start(l3, True, True, 0)
evbox.add(hbox)
win.add(evbox)

win.show_all()
gtk.main()
##########################################################################

La base de la solución pasa por conectar la señal "expose" (que se
encarga de redibujar los contenidos del widget) en la que pintas la
imagen.
Además, como las ni VBox ni HBox permiten conectar señales, lo
envuelves en un EventBox.
En gtk+ v3.x es similar procedimiento, pero el nombre de la señal ha cambiado.


Espero que te sea de ayuda.

Saludos,
Iñigo Serna


Más información sobre la lista de distribución Python-es