Inicio > pygtk, python > Cómo navegar de un widget a otro en python + gtk

Cómo navegar de un widget a otro en python + gtk

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:

  1. “La tecla <Enter> debe permitir navegar de campo a campo”.
  2. “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…

Categorías:pygtk, python
  1. septiembre 17, 2007 a las 2:59 am

    Fijate que todavía se puede hacer mejor esa porción de código; cuándo lo ví no me gustó mucho el for que hace el manejo de los index. En la lista de PyAr cuando yo postié sobre cómo hacer bucles, te podés fijar en el módulo itertools o crearte una funcion para que te devuelva de a dos elementos de la lista por ejemplo…
    Saludos!

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: