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:
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.