10.7. Controles de Panel (HPaned y VPaned)

Los controles de paneles son útiles cuando se quiere dividir un área en dos partes, con el tamaño relativo de las dos partes controlado por el usuario. Se dibuja una barra entre las dos partes con un mango que el usuario puede arrastrar para cambiar la relación. La división puede ser horizontal (HPaned) o vertical (VPaned).

Para crear una nueva ventana con panel, se hace una llamada a:

  hpane = gtk.HPaned()
  o
  vpane = gtk.VPaned()

Después de crear el control de panel, hay que añadir hijos a sus dos mitades. Para hacer eso, se usan los métodos:

  paned.add1(child)

  paned.add2(child)

El método add1() añade el control hijo child a la izquierda o arriba del control de panel. El método add2() añade un control hijo child a la derecha o abajo del panel.

El programa de ejemplo paned.py crea parte de la interfaz de usuario de un programa de correo electrónico imaginario. Una ventana se divide en dos partes verticalmente, donde la parte de arriba es una lista de correos electrónicos y la parte de abajo es el texto del mensaje electrónico. La mayoría del programa es bastante sencillo. Hay un par de puntos en los que hacer hincapie: no se puede añadir texto a un control Text hasta que se realiza. Esto podría conseguirse llamando al método realize() , pero como demostración de una técnica alternativa, conectamos un manejador para la señal "realize" para añadir el texto. Además, necesitamos añadir la opción SHRINK (encoger) a algunos de los elementos de la tabla que contiene la ventana de texto y sus barras de desplazamiento, para que cuando la parte de abajo se haga más pequeña, las secciones correctas se encojan en vez de que desaparezcan por la parte de abajo de la ventana. La figura Figura 10.6, “Ejemplo de Panel” muestra el resultado de ejecutar el programa:

Figura 10.6. Ejemplo de Panel

Ejemplo de Panel

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

    1	#!/usr/bin/env python
    2	
    3	# ejemplo paned.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk, gobject
    8	
    9	class PanedExample:
   10	    # Creamos la lista de "mensajes"
   11	    def create_list(self):
   12	        # Creamos una ventana, con desplazamiento si es necesario
   13	        scrolled_window = gtk.ScrolledWindow()
   14	        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
   15	
   16	        model = gtk.ListStore(gobject.TYPE_STRING)
   17	        tree_view = gtk.TreeView(model)
   18	        scrolled_window.add_with_viewport (tree_view)
   19	        tree_view.show()
   20	
   21	        # Añadimos algunos mensajes a la ventana
   22	        for i in range(10):
   23	            msg = "Message #%d" % i
   24	            iter = model.append()
   25	            model.set(iter, 0, msg)
   26	
   27	        cell = gtk.CellRendererText()
   28	        column = gtk.TreeViewColumn("Messages", cell, text=0)
   29	        tree_view.append_column(column)
   30	
   31	        return scrolled_window
   32	   
   33	    # Añadimos texto a nuestro control de texto - esta retrollamada se invoca
   34	    # cuando se realiza nuestra ventana. Podríamos forzar también la realización
   35	    # mediante gtk.Widget.realize(), pero primero tendría que ser parte
   36	    # de una jerarquía
   37	    def insert_text(self, buffer):
   38	        iter = buffer.get_iter_at_offset(0)
   39	        buffer.insert(iter,
   40	                      "From: pathfinder@nasa.gov\n"
   41	                      "To: mom@nasa.gov\n"
   42	                      "Subject: Made it!\n"
   43	                      "\n"
   44	                      "We just got in this morning. The weather has been\n"
   45	                      "great - clear but cold, and there are lots of fun sights.\n"
   46	                      "Sojourner says hi. See you soon.\n"
   47	                      " -Path\n")
   48	   
   49	    # Creamos un área de texto desplazable que muestra un "mensaje"
   50	    def create_text(self):
   51	        view = gtk.TextView()
   52	        buffer = view.get_buffer()
   53	        scrolled_window = gtk.ScrolledWindow()
   54	        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
   55	        scrolled_window.add(view)
   56	        self.insert_text(buffer)
   57	        scrolled_window.show_all()
   58	        return scrolled_window
   59	   
   60	    def __init__(self):
   61	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   62	        window.set_title("Paned Windows")
   63	        window.connect("destroy", lambda w: gtk.main_quit())
   64	        window.set_border_width(10)
   65	        window.set_size_request(450, 400)
   66	
   67	        # creamos un control vpaned y lo añadimos a la ventana principal
   68	        vpaned = gtk.VPaned()
   69	        window.add(vpaned)
   70	        vpaned.show()
   71	
   72	        # Ahora creamos los contenidos de las dos partes de la ventana
   73	        list = self.create_list()
   74	        vpaned.add1(list)
   75	        list.show()
   76	
   77	        text = self.create_text()
   78	        vpaned.add2(text)
   79	        text.show()
   80	        window.show()
   81	
   82	def main():
   83	    gtk.main()
   84	    return 0
   85	
   86	if __name__ == "__main__":
   87	    PanedExample()
   88	    main()