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