Capítulo 10. Controles Contenedores

Tabla de contenidos

10.1. La Caja de Eventos (EventBox)
10.2. El control Alineador
10.3. Contenedor Fijo (Fixed)
10.4. Contenedor de Disposición (Layout)
10.5. Marcos (Frame)
10.6. Marcos Proporcionales (AspectFrame)
10.7. Controles de Panel (HPaned y VPaned)
10.8. Vistas (Viewport)
10.9. Ventanas de Desplazamiento (ScrolledWindow)
10.10. Cajas de Botones (ButtonBoxes)
10.11. Barra de Herramientas (Toolbar)
10.12. Fichas (Notebook)
10.13. Elementos incrustables y puntos de conexión (Plugs y Sockets)
10.13.1. Elementos incrustables (Plugs)
10.13.2. Puntos de Conexión (Sockets)

10.1. La Caja de Eventos (EventBox)

Algunos controles GTK no tienen ventanas X asociadas, por lo que simplemente se dibujan encima de sus padres. A causa de esto, no pueden recibir eventos y si se dimensionan incorrectamente, no pueden recortarse por lo que puedes ver partes mal, etc. Si se necesita más de estos controles, la EventBox (Caja de Eventos) es lo que se necesita.

A primera vista, el control EventBox puede aparecer completamente inútil. No dibuja nada en la pantalla y no responde a ningún evento. Sin embargo, tiene una función - proporciona una ventana X a sus controles hijos. Esto es importante ya que muchos controles GTK no tienen una ventana X asociada. No tener una ventana X ahorra memoria y mejora el rendimiento, pero también tiene inconvenientes. Un control sin ventana X no puede recibir eventos, no realiza ningun recortado sobre sus contenidos y no puede establecer su color de fondo. Aunque el nombre EventBox enfatiza la función de manejador de eventos, el control también se puede usar para recorte. (y más, mira el ejemplo más abajo).

Para crear un nuevo control EventBox, se usa:

  event_box = gtk.EventBox()

Un control hijo se puede añadir a esta event_box:

  event_box.add(widget) 

El programa de ejemplo eventbox.py muestra dos usos de un EventBox - se crea una etiqueta y se recorta en una caja pequeña, tiene un fondo verde y se ha configurado para que un clic de ratón en la etiqueta haga que el programa termine. Al redimensionar la ventana se cambian cantidades en la etiqueta. La figura Figura 10.1, “Ejemplo de Caja de Eventos” muestra la ventana del programa:

Figura 10.1. Ejemplo de Caja de Eventos

Ejemplo de Caja de Eventos

El código fuente de eventbox.py es:

    1	#!/usr/bin/env python
    2	
    3	# ejemplo eventbox.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk
    8	
    9	class EventBoxExample:
   10	    def __init__(self):
   11	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   12	        window.set_title("Event Box")
   13	        window.connect("destroy", lambda w: gtk.main_quit())
   14	        window.set_border_width(10)
   15	
   16	        # Creamos una EventBox y la añadimos a la ventana principal
   17	        event_box = gtk.EventBox()
   18	        window.add(event_box)
   19	        event_box.show()
   20	
   21	        # Creamos una etiqueta larga
   22	        label = gtk.Label("Click here to quit, quit, quit, quit, quit")
   23	        event_box.add(label)
   24	        label.show()
   25	
   26	        # La recortamos
   27	        label.set_size_request(110, 20)
   28	
   29	        # Y conectamos una acción a la misma
   30	        event_box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
   31	        event_box.connect("button_press_event", lambda w,e: gtk.main_quit())
   32	
   33	        # Más cosas para las que se necesita una ventana de X ...
   34	        event_box.realize()
   35	        event_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
   36	
   37	        # Poner el fondo en verde
   38	        event_box.modify_bg(gtk.STATE_NORMAL,
   39	                            event_box.get_colormap().alloc_color("green"))
   40	
   41	        window.show()
   42	
   43	def main():
   44	    gtk.main()
   45	    return 0
   46	
   47	if __name__ == "__main__":
   48	    EventBoxExample()
   49	    main()