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