La solución ofrecida para PyGTK en el enlace publicado en la pregunta no funciona en Python-GI con GTK3, aunque el truco de utilizar una ventana desplazada en lugar del cuadro habitual fue muy útil.
Aquí está mi solución de trabajo mínima para obtener una imagen en un botón para cambiar el tamaño del contenedor.
from gi.repository import Gtk, Gdk, GdkPixbuf
class ButtonWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Button Demo")
self.set_border_width(10)
self.connect("delete-event", Gtk.main_quit)
self.connect("check_resize", self.on_check_resize)
self.box = Gtk.ScrolledWindow()
self.box.set_policy(Gtk.PolicyType.ALWAYS,
Gtk.PolicyType.ALWAYS)
self.add(self.box)
self.click = Gtk.Button()
self.box.add_with_viewport(self.click)
self.pixbuf = GdkPixbuf.Pixbuf().new_from_file('gtk-logo-rgb.jpg')
self.image = Gtk.Image().new_from_pixbuf(self.pixbuf)
self.click.add(self.image)
def resizeImage(self, x, y):
print('Resizing Image to ('+str(x)+','+str(y)+')....')
pixbuf = self.pixbuf.scale_simple(x, y,
GdkPixbuf.InterpType.BILINEAR)
self.image.set_from_pixbuf(pixbuf)
def on_check_resize(self, window):
print("Checking resize....")
boxAllocation = self.box.get_allocation()
self.click.set_allocation(boxAllocation)
self.resizeImage(boxAllocation.width-10,
boxAllocation.height-10)
win = ButtonWindow()
win.show_all()
Gtk.main()
(El -10 de la anchura y la altura son para dar cabida a las fronteras interiores y el relleno en el botón. Traté de tocar el violín con esto para conseguir una imagen más grande en el botón, pero el resultado no se veía tan agradable .)
El archivo jpeg utilizado en este ejemplo se puede descargar desde here.
Agradezco más sugerencias sobre cómo hacer esto.
Intenté cambiar a este método en mi programa de prueba y obtuve un traceback (Python 3.2, Debian Wheezy). Posiblemente este método sea más nuevo para la API (pero la documentación parece contradecir eso). Pero al leer la documentación, creo que te equivocas al crear la imagen dos veces (consulta ['set_from_pixbuf'] (http://www.pygtk.org/pygtk2reference/class-gtkimage.html#method-gtkimage--set-from-pixbuf) y ['new_from_pixbuf'] (http://www.pygtk.org/pygtk2reference/class-gtkimage.html#function-gtk--image-new-from-pixbuf)). Ambos crean una nueva imagen desde el pixbuf. Hay un pixbuf, una imagen. – Bobble