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:
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()