Programando “ghhp”, Sistema de Mesa de Ayuda – lo estamos realizando para el trabajo final de Diseño de Sistemas – acabo de terminar de hacer los requisitos funcionales de un Caso de Uso , que decían lo siguiente:
- “La tecla <Enter> debe permitir navegar de campo a campo”.
- “El registro del ticket debe ser ágil y debe poder realizarse con la sola utilización del teclado”.
El cumplimiento del segundo requisito se logra con un diseño de interfaz tal que nos permita cumplir esa acción. Y el primero lo logramos con la activación de la señal de los widget grab_focus().
Voy a mostrar dos formas de hacerlo, seguro habrá más
éstas son la que yo hice.
Primera Apoximacion:
def conect_entry_enter(self):
….self.entry_1.connect(“activate”, self.on_entry_activate,self.entry_2)
….self.entry_2.connect(“activate”, self.on_entry_activate,self.entry_3)
….self.entry_3.connect(“activate”, self.on_entry_activate,self.entry_4)
def on_entry_activate(self, widget, other):
….other.grab_focus()
La señal “activate” es emitida cuando la entrada es activada por el usuario al presionar la tecla <Enter> (tecla que por defecto esta asiganada a esta señal, a mi me vino al pelo porque es lo que buscaba, de no ser asi podemos programar la tecla que quisieramos con el método gtk.Widget.activate().
Luego se llama a on_entry_activate() que lo que realiza es modificar el foco del cursor al widget que le pasamos por parametro. La idea seria 1-> 2-> 3-> 4. Imaginemos que son campos de entrada y vamos “saltando” de uno en uno.
Segunda Aproximación:
Que notaron en la primera version?. Sí eso es lo mismo que estoy pensando, es muy repetitivo el código, no es cierto?, lo que nos dice que estamos en precensia de un patrón, y con el poder de python debemos sacarle provecho. Observemos
def conect_entry_enter(self):
….def grab_focus(widget, other):
……..other.grab_focus()
….path =(self.entry_1, self.entry_2, self.entry_3, self.entry_4)
….for index in xrange(len(path)-1):
……..from0, to = path[index:index+2]
……..from0.connect(“activate”, grab_focus, to)
Mejor no?. Lo único diferente es que usamos un bucle para asociar las señales a los widget. xrange va generando una a una esas asociaciones, xrange tiene la ventaja que usa una cantidad de memoria que es fija, sin importar la longitud de la secuencia involucrada.
Espero que les sirva y se entienda…
Escrito por nercof