Tabla de contenidos
Algunos controles GTK no tienen ventanas X asociadas, por lo que
simplemente se dibujan encima de sus padres. A causa de esto, no pueden recibir
eventos y si se dimensionan incorrectamente, no pueden recortarse por lo que
puedes ver partes mal, etc. Si se necesita más de estos controles, la
EventBox (Caja de Eventos) es lo que se necesita.
A primera vista, el control EventBox puede
aparecer completamente inútil. No dibuja nada en la pantalla y no responde a
ningún evento. Sin embargo, tiene una función - proporciona una ventana X a sus
controles hijos. Esto es importante ya que muchos controles GTK no tienen una
ventana X asociada. No tener una ventana X ahorra memoria y mejora el
rendimiento, pero también tiene inconvenientes. Un control sin ventana X no
puede recibir eventos, no realiza ningun recortado sobre sus contenidos y
no puede establecer su color de fondo. Aunque el nombre
EventBox enfatiza la función de manejador de eventos,
el control también se puede usar para recorte. (y más, mira el ejemplo más
abajo).
Para crear un nuevo control EventBox, se usa:
event_box = gtk.EventBox()
Un control hijo se puede añadir a esta event_box:
event_box.add(widget)
El programa de ejemplo eventbox.py muestra dos
usos de un EventBox - se crea una etiqueta y se
recorta en una caja pequeña, tiene un fondo verde y se ha configurado para que
un clic de ratón en la etiqueta haga que el programa termine. Al redimensionar
la ventana se cambian cantidades en la etiqueta. La figura
Figura 10.1, “Ejemplo de Caja de Eventos” muestra la ventana del programa:
El código fuente de eventbox.py es:
1 #!/usr/bin/env python
2
3 # ejemplo eventbox.py
4
5 import pygtk
6 pygtk.require('2.0')
7 import gtk
8
9 class EventBoxExample:
10 def __init__(self):
11 window = gtk.Window(gtk.WINDOW_TOPLEVEL)
12 window.set_title("Event Box")
13 window.connect("destroy", lambda w: gtk.main_quit())
14 window.set_border_width(10)
15
16 # Creamos una EventBox y la añadimos a la ventana principal
17 event_box = gtk.EventBox()
18 window.add(event_box)
19 event_box.show()
20
21 # Creamos una etiqueta larga
22 label = gtk.Label("Click here to quit, quit, quit, quit, quit")
23 event_box.add(label)
24 label.show()
25
26 # La recortamos
27 label.set_size_request(110, 20)
28
29 # Y conectamos una acción a la misma
30 event_box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
31 event_box.connect("button_press_event", lambda w,e: gtk.main_quit())
32
33 # Más cosas para las que se necesita una ventana de X ...
34 event_box.realize()
35 event_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
36
37 # Poner el fondo en verde
38 event_box.modify_bg(gtk.STATE_NORMAL,
39 event_box.get_colormap().alloc_color("green"))
40
41 window.show()
42
43 def main():
44 gtk.main()
45 return 0
46
47 if __name__ == "__main__":
48 EventBoxExample()
49 main()