2012-09-11 17 views
5

Aunque he encontrado respuestas parciales e indirectas a esta pregunta (ver, por ej., this link), estoy publicando esto aquí porque juntar los pedazos del rompecabezas me llevó un poco de tiempo, y pensé que alguien más podría encontrar mis esfuerzos de uso.cómo hacer cambio automático de tamaño de imagen en Python3 con PyGI?

Entonces, ¿cómo lograr un cambio de tamaño sin inconvenientes de las imágenes en los botones en GTK + cuando se cambia el tamaño de la ventana principal?

Respuesta

5

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.

0

self.image = Gtk.Image().new_from_pixbuf(self.pixbuf) probablemente debería ser: self.image = Gtk.Image().set_from_pixbuf(self.pixbuf)

va a crear una nueva imagen dos veces.

+0

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

Cuestiones relacionadas