7.3. Interioridades de un Ajuste

Bien, se pensará, eso está bien, pero ¿qué sucede si se desea crear unos manejadores propios que respondan cuando el usuario ajuste un control de rango o un botón aumentar/disminuir, y cómo se obtiene el valor de un ajuste en estos manejadores? Para contestar a estas preguntas y a otras más, empezaremos echando un vistazo a los atributos de la propia clase gtk.Adjustment:

  lower
  upper
  value
  step_increment
  page_increment
  page_size

Dada una instancia adj de la clase gtk.Adjustment, cada uno de los atributos se obtienen o modifican usando adj.lower, adj.value, etc.

Ya que, cuando se determina el valor de un ajuste, generalmente también se quiere que el cambio afecte a todos los controles que usan este ajuste, PyGTK proporciona un método para hacer esto mismo:

  adjustment.set_value(value)

Como se mencionó anteriormente, Adjustment es una subclase de Object, al igual que los demás controles, y, por tanto, es capaz de emitir señales. Esto es la causa, claro está, de por qué las actualizaciones ocurren automágicamente cuando se comparte un objeto ajuste entre una barra de desplazamiento y otro control ajustable; todos los controles ajustables conectan manejadores de señales a la señal "value_changed" de sus ajustes, como podría hacerlo cualquier programa. Esta es la definición de la retrollamada de esta señal:

  def value_changed(adjustment):

Los diversos controles que usan el objeto Adjustment emitirán esta señal en un ajuste siempre que cambien su valor. Esto ocurre tanto cuando el usuario hace que el deslizador se mueva en un control de rango, como cuando el programa explícitamente cambia el valor con el método set_value(). Así, por ejemplo, si se tiene un control de escala, y se quiere que cambie la rotación de una imagen siempre que su valor cambie, se podría crear una retrollamada como esta:

  def cb_rotate_picture(adj, picture):
      set_picture_rotation (picture, adj.value)
  ...

y conectarla al ajuste del control de escala así:

  adj.connect("value_changed", cb_rotate_picture, picture)

¿Y qué pasa cuando un control reconfigura los campos upper (superior) o lower (inferior) de su ajuste, tal y como sucede cuando un usario añade más texto al control de texto? En este caso, se emite la señal "changed", que es así:

  def changed(adjustment):

Los controles Range normalmente conectan un manejador para esta señal, el cual cambia su apariencia para reflejar el cambio - por ejemplo, el tamaño del deslizador de una barra de desplazamiento aumentará o se reducirá en proporción inversa a la diferencia entre el valor superior e inferior de su ajuste.

Probablemente nunca será necesario que se haga la conexión de un manejador a esta señal, salvo que se esté escribiendo un nuevo tipo de control de rango. En cualquier caso, si se cambia directamente alguno de los valores de un Adjustment, se debe emitir esta señal para reconfigurar los controles que lo usan. Tal que así:

  adjustment.emit("changed")