Vale, dirás, eso está bien, pero ¿qué pasa si quiero crear mis propios manejadores que respondan cuando el usuario ajuste un control de rango o un botón aumentar/disminuir, y cómo obtengo el valor de un ajuste en estos manejadores? Para contestar a estas preguntas y a otras más, vamos a empezar mirando los atributos de la propia clase gtk.Adjustment :
lower upper value step_increment page_increment page_size |
Sea adj una instancia de la clase gtk.Adjustment, cada uno de los atributos se obtienen o modifican usando adj.lower, adj.value, etc.
Ya que, cuando pones el valor de un ajuste, generalmente quieres que el cambio afecte a todos los controles que usan este ajuste, PyGTK proporciona un método para hacer esto:
adjustment.set_value(value)
|
Como se ha dicho antes, Adjustment es una subclase de Object 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 compartes 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 tu programa. Aqui tienes 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 tienes un control de escala, y quieres que cambie la rotación de una imagen siempre que su valor cambie, podrías 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 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 crecerá o encojerá en proporción inversa a la diferencia entre el valor superior e inferior de su ajuste.
Probablemente nunca tendrás que conectar un manejador a esta señal, a menos que estes escribiendo un nuevo tipo de control de rango. En cualquier caso, si cambias alguno de los valores de un Adjustment directamente, deberías emitir esta señal para reconfigurar los controles que lo están usando, tal que así:
adjustment.emit("changed")
|
¡Ahora adelante y ajusta!