10.9. Ventanas de Desplazamiento (ScrolledWindow)

Las ventanas de desplazamiento se usan para crear un área de desplazamiento con otro control dentro de ella. Se puede insertar cualquier tipo de control dentro de una ventana de desplazamiento, y será accesible, independientemente del tamaño, usando barras de desplazamiento.

La siguiente función se usa para crear una nueva ventana de desplazamiento.

  scrolled_window = gtk.ScrolledWindow(hadjustment=None, vadjustment=None)

Donde el primer argumento es el ajuste para la dirección horizontal, y el segundo, el ajuste para la dirección vertical. Casi siempre se ponen a None o no se especifican.

  scrolled_window.set_policy(hscrollbar_policy, vscrollbar_policy)

Este método especifica la política a usar con respecto a las barras de desplazamiento. El primer argumento le fija la política a la barra de desplazamiento horizontal, y el segundo, la política de la barra de desplazamiento vertical.

La política puede tomar los valores POLICY_AUTOMATIC o POLICY_ALWAYS. POLICY_AUTOMATIC decidirá automáticamente si son necesarias las barras de desplazamiento, mientras que POLICY_ALWAYS siempre dejará visibles las barras de desplazamiento.

Tras esto se puede colocar el objeto dentro de la ventana de desplazamiento usando el siguiente método.

  scrolled_window.add_with_viewport(child)

El programa de ejemplo scrolledwin.py coloca una tabla con 100 botones biestado dentro de una ventana de desplazamiento. Sólo se comentan las partes que pueden ser nuevas. La figura Figura 10.7, “Ejemplo de Ventana de Desplazamiento” muestra la ventana del programa:

Figura 10.7. Ejemplo de Ventana de Desplazamiento

Ejemplo de Ventana de Desplazamiento

El código fuente de scrolledwin.py es:

    1	#!/usr/bin/env python
    2	
    3	# ejemplo scrolledwin.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk
    8	
    9	class ScrolledWindowExample:
   10	    def destroy(self, widget):
   11	        gtk.main_quit()
   12	
   13	    def __init__(self):
   14	        # Creamos una nueva ventana de diálogo en la que empaquetar
   15	        # la ventana de desplazamiento
   16	        window = gtk.Dialog()
   17	        window.connect("destroy", self.destroy)
   18	        window.set_title("ScrolledWindow example")
   19	        window.set_border_width(0)
   20	        window.set_size_request(300, 300)
   21	
   22	        # creamos una nueva ventana de desplazamiento
   23	        scrolled_window = gtk.ScrolledWindow()
   24	        scrolled_window.set_border_width(10)
   25	
   26	        # la política es bien POLICY AUTOMATIC, o bien POLICY_ALWAYS.
   27	        # POLICY_AUTOMATIC decidirá automáticamente la necesidad de barras de
   28	        # desplazamiento, mientras que POLICY_ALWAYS dejará permanentemente las
   29	        # barras. La primera es la barra de desplazamiento horizontal, la segunda la
   30	        # vertical.
   31	        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
   32	
   33	        # Se crea la ventana de diálogo con una vbox en ella
   34	        window.vbox.pack_start(scrolled_window, gtk.TRUE, gtk.TRUE, 0)
   35	        scrolled_window.show()
   36	    
   37	        # creamos una tabla de 10 por 10 casillas
   38	        table = gtk.Table(10, 10, gtk.FALSE)
   39	
   40	        # fijamos el espaciado a 10 en x y 10 en y
   41	        table.set_row_spacings(10)
   42	        table.set_col_spacings(10)
   43	
   44	        # empaquetamos la tabla en la ventana de desplazamiento
   45	        scrolled_window.add_with_viewport(table)
   46	        table.show()
   47	
   48	        # esto simplemente crea una trama de botones biestado en la tabla
   49	        # para demostrar el uso de la ventana de desplazamiento
   50	        for i in range(10):
   51	            for j in range(10):
   52	                buffer = "button (%d,%d)" % (i, j)
   53	                button = gtk.ToggleButton(buffer)
   54	                table.attach(button, i, i+1, j, j+1)
   55	                button.show()
   56	
   57	        # Añadimos un botón "close" en la parte inferior del diálogo
   58	        button = gtk.Button("close")
   59	        button.connect_object("clicked", self.destroy, window)
   60	
   61	        # ponemos el botón como posible predeterminado
   62	        button.set_flags(gtk.CAN_DEFAULT)
   63	        window.action_area.pack_start( button, gtk.TRUE, gtk.TRUE, 0)
   64	
   65	        # Esto lo establece como predeterminado. Pulsando
   66	        # "Enter" hará que se active este botón
   67	        button.grab_default()
   68	        button.show()
   69	        window.show()
   70	
   71	def main():
   72	    gtk.main()
   73	    return 0
   74	
   75	if __name__ == "__main__":
   76	    ScrolledWindowExample()
   77	    main()

Si se prueba a cambiar el tamaño a la ventana se verá cómo reaccionan las barras de desplazamiento. Puede que también se quiera usar el método set_size_request() para fijar el tamaño por defecto de la ventana o de otros controles.