Tengo un widget GtkImage
en una ventana de tamaño variable y una referencia GdkPixBuf
que almacena la imagen con la que quiero llenar el GtkImage
.Escalado de imagen automático al cambiar el tamaño con (Py) GTK
puedo escalar la GdkPixBuf
para llenar el widget GtkImage
usando este método:
def update_image(self, widget=None, data=None):
# Get the size of the source pixmap
src_width, src_height = self.current_image.get_width(), self.current_image.get_height()
# Get the size of the widget area
widget = self.builder.get_object('image')
allocation = widget.get_allocation()
dst_width, dst_height = allocation.width, allocation.height
# Scale preserving ratio
scale = min(float(dst_width)/src_width, float(dst_height)/src_height)
new_width = int(scale*src_width)
new_height = int(scale*src_height)
pixbuf = self.current_image.scale_simple(new_width, new_height, gtk.gdk.INTERP_BILINEAR)
# Put the generated pixbuf in the GtkImage widget
widget.set_from_pixbuf(pixbuf)
Cuando llamo update_image
manualmente funciona como se esperaba. Ahora quiero que la escala se produzca automáticamente cuando se cambie el tamaño del widget GtkImage. La mejor solución que obtuve fue enlazar el método update_image
con el evento GTK configure-event
de la ventana. Después de cada cambio de tamaño de la ventana, la imagen está correctamente escalada. Sin embargo, tengo dos problemas con esta solución:
- Solo puedo agrandar la ventana. Una vez que la imagen ha sido escalada, GTK no me permitirá cambiar el tamaño de la ventana más pequeña porque la ventana no puede ser más pequeña que sus widgets. Entiendo por qué funciona así, pero no sé cómo cambiar este comportamiento.
- Quizás esto no es gran cosa, pero hubiera preferido un evento del widget GtkImage en lugar de la ventana de nivel superior.
Disculpa la larga explicación de un problema tan trivial, espero que puedas ayudarme.
Muchas gracias, el truco de ScrolledWindow funcionó. Obtengo un 'GtkWarning: gtk_scrolled_window_add(): no se puede agregar el widget no desplazable use gtk_scrolled_window_add_with_viewport() en su lugar', pero si agrego una ventana gráfica, aparecen las barras de desplazamiento cuando reduzco el tamaño de la ventana, así que lo dejo así por ahora. Se llama al 'expose-event' en cada iteración de gtk, por lo que maximiza el uso de la CPU. – Jim