Los controles Ruler (Regla) se usan para indicar la posición del puntero del ratón en una ventana determinada. Una ventana puede tener una regla vertical a lo largo del ancho y una regla horizontal a lo largo del alto. Un pequeño triángulo indicador en la regla muestra la posición exacta del puntero relativa a la regla.
Una regla debe crearse primero. Reglas horizontales y verticales se crean usando las siguientes funciones:
hruler = gtk.HRuler() # regla horizontal vruler = gtk.VRuler() # regla vertical |
Una vez que una regla se crea, podemos definir la unidad de medida. Las unidades de medida para las reglas pueden ser PIXELS (PIXELES), INCHES (PULGADAS) o CENTIMETERS (CENTIMETROS). Esto se fija usando el método:
ruler.set_metric(metric)
|
La medida predeterminada es PIXELS.
ruler.set_metric(gtk.PIXELS) |
Otra característica importante de una regla es cómo marca las unidades de escala y donde se coloca el indicador de posición inicialmente. Esto se fija usando el método:
ruler.set_range(lower, upper, position, max_size) |
Los argumentos lower (bajo) y upper (alto) definen la extensión de la regla, y max_size (tamaño máximo) es el mayor número posible que se visualizará. La Position (Posición) define la posición inicial del indicador del puntero dentro de la regla.
Una regla vertical puede medir una ventana de 800 píxeles de ancho de la siguiente forma:
vruler.set_range(0, 800, 0, 800) |
Las marcas mostradas en la regla irán desde 0 a 800, con un número cada 100 píxeles. Si en lugar de eso quisieramos una regla de 7 a 16, escribiríamos
vruler.set_range(7, 16, 0, 20) |
El indicador de la regla es una pequeña marca triangular que indica la posición del puntero relativa a la regla. Si la regla se usa para seguir el puntero del ratón, la señal "motion_notify_event" debe conectarse al método "motion_notify_event" de la regla. Hay que configurar una retrollamada para "motion_notify_event" para el área y usar connect_object() para que la regla emita una señal "motion_notify_signal":
def motion_notify(ruler, event):
return ruler.emit("motion_notify_event", event)
area.connect_object("motion_notify_event", motion_notify, ruler)
|
El programa de ejemplo rulers.py crea un área de dibujo con una regla horizontal en la parte de arriba y una regla vertical a su izquierda. El tamaño del área de dibujo es de 600 píxeles de ancho por 400 píxeles de alto. La regla horizontal va desde 7 hasta 13 con una marca cada 100 píxeles, mientras que la regla vertical va de 0 a 400 con una marca cada 100 píxeles. La colocación del área de dibujo y las reglas se hace con una tabla. La figura Figura 9.8. Ejemplo de Reglas ilustra el resultado:
El código fuente es rulers.py :
1 #!/usr/bin/env python
2
3 # example rulers.py
4
5 import gtk
6
7 class RulersExample:
8 XSIZE = 600
9 YSIZE = 400
10
11 # This routine gets control when the close button is clicked
12 def close_application(self, widget, event, data=None):
13 gtk.mainquit()
14 return gtk.FALSE
15
16 def __init__(self):
17 window = gtk.Window(gtk.WINDOW_TOPLEVEL)
18 window.connect("delete_event", self.close_application)
19 window.set_border_width(10)
20
21 # Create a table for placing the ruler and the drawing area
22 table = gtk.Table(3, 2, gtk.FALSE)
23 window.add(table)
24
25 area = gtk.DrawingArea()
26 area.set_size_request(self.XSIZE, self.YSIZE)
27 table.attach(area, 1, 2, 1, 2,
28 gtk.EXPAND|gtk.FILL, gtk.FILL, 0, 0 )
29 area.set_events(gtk.gdk.POINTER_MOTION_MASK |
30 gtk.gdk.POINTER_MOTION_HINT_MASK )
31
32 # The horizontal ruler goes on top. As the mouse moves across the
33 # drawing area, a motion_notify_event is passed to the
34 # appropriate event handler for the ruler.
35 hrule = gtk.HRuler()
36 hrule.set_metric(gtk.PIXELS)
37 hrule.set_range(7, 13, 0, 20)
38 def motion_notify(ruler, event):
39 return ruler.emit("motion_notify_event", event)
40 area.connect_object("motion_notify_event", motion_notify, hrule)
41 table.attach(hrule, 1, 2, 0, 1,
42 gtk.EXPAND|gtk.SHRINK|gtk.FILL, gtk.FILL, 0, 0 )
43
44 # The vertical ruler goes on the left. As the mouse moves across
45 # the drawing area, a motion_notify_event is passed to the
46 # appropriate event handler for the ruler.
47 vrule = gtk.VRuler()
48 vrule.set_metric(gtk.PIXELS)
49 vrule.set_range(0, self.YSIZE, 10, self.YSIZE)
50 area.connect_object("motion_notify_event", motion_notify, vrule)
51 table.attach(vrule, 0, 1, 1, 2,
52 gtk.FILL, gtk.EXPAND|gtk.SHRINK|gtk.FILL, 0, 0 )
53
54 # Now show everything
55 area.show()
56 hrule.show()
57 vrule.show()
58 table.show()
59 window.show()
60
61 def main():
62 gtk.main()
63 return 0
64
65 if __name__ == "__main__":
66 RulersExample()
67 main()
|
Las lineas 40 y 50 conectan la retrollamada motion_notify() al área pasandole hrule en la linea 40 y vrule en la linea 50 como datos de usuario. La retrollamada motion_notify() se llamará dos veces cada vez que el ratón se mueva - una vez con hrule y otra vez con vrule.