9.7. Reglas

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:

Figura 9.8. Ejemplo de Reglas

Ejemplo de Reglas

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.