10.6. Marcos Proporcionales (AspectFrame)

El control de marco proporcional es como un control de marco, excepto en que también mantiene el cociente de proporcionalidad (esto es, el cociente del ancho entre el alto) del control hijo en un determinado valor, añadiendo espacio extra si es necesario. Esto es útil, por ejemplo, si se quiere previsualizar una imagen más grande. El tamaño de la previsualización debería variar cuando el usuario redimensione la ventana, pero el cociente de proporcionalidad debe siempre corresponderse al de la imagen original.

Para crear un nuevo marco proporcional se utiliza:

  aspect_frame = gtk.AspectFrame(label=None, xalign=0.5, yalign=0.5, ratio=1.0, obey_child=TRUE)

label especifica el texto a mostrar en el título. xalign e yalign especifican la alineación como en el control Alignment. Si obey_child es TRUE, el cociente de proporcionalidad de un control hijo se corresponderá con el cociente de proporcionalidad del tamaño ideal que solicite. En caso contrario, se especifica dicho cociente con el argumento ratio.

Para cambiar las opciones de un marco proporcional existente, se puede utilizar:

  aspect_frame.set(xalign=0.0, yalign=0.0, ratio=1.0, obey_child=TRUE)

Como ejemplo, el programa aspectframe.py usa un AspectFrame para presentar un área de dibujo cuyo cociente de proporcionalidad será siempre 2:1, aunque el usuario redimensione la ventana contenedora. La figura Figura 10.5, “Ejemplo de Marco Proporcional” muestra la ventana del programa:

Figura 10.5. Ejemplo de Marco Proporcional

Ejemplo de Marco Proporcional

El código fuente del programa aspectframe.py es:

    1	#!/usr/bin/env python
    2	
    3	# ejemplo aspectframe.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk
    8	
    9	class AspectFrameExample:
   10	    def __init__(self):
   11	        window = gtk.Window(gtk.WINDOW_TOPLEVEL);
   12	        window.set_title("Aspect Frame")
   13	        window.connect("destroy", lambda x: gtk.main_quit())
   14	        window.set_border_width(10)
   15	
   16	        # Creamos un marco proporcional aspect_frame y lo añadimos a la ventana
   17	        aspect_frame = gtk.AspectFrame("2x1", # label
   18	                                       0.5, # center x
   19	                                       0.5, # center y
   20	                                       2, # xsize/ysize = 2
   21	                                       gtk.FALSE) # ignore child's aspect
   22	        window.add(aspect_frame)
   23	        aspect_frame.show()
   24	
   25	        # Añadimos un control hijo al marco proporcional
   26	        drawing_area = gtk.DrawingArea()
   27	
   28	        # Solicitamos una ventana 200x200, pero AspectFrame nos devolverá una 200x100
   29	        # puesto que forzamos una proporción 2x1
   30	        drawing_area.set_size_request(200, 200)
   31	        aspect_frame.add(drawing_area)
   32	        drawing_area.show()
   33	        window.show()
   34	
   35	def main():
   36	    gtk.main()
   37	    return 0
   38	
   39	if __name__ == "__main__":
   40	    AspectFrameExample()
   41	    main()