Simplificar codigo.

Joaquin Jose del Cerro Murciano jjdelcerromurciano en yahoo.es
Mie Ago 31 09:00:14 CEST 2005


El Miércoles, 31 de Agosto de 2005 07:05, Ariel Nardelli escribió:
> Hola!
> Estoy haciendo un sistema de gestion (wx + python2.3) que tiene muchos
> textbox que "levantan" info desde pantalla para grabar todos esos datos
> en la base de datos.
>
> Haciendo el programa y tratando de afinar mas el codigo (sobre todo
> sacar el codigo repetitivo) veo que una rutina sobre todo se me repite
> constantemente solo me cambia 2 lineas pero los demas es siempre el
> mismo y entonces se me ocurrio simplificar todo y tratar de usar solo
> una rutina.
>
> Les explico con ejemplos, tengo dentro de programa los armados de
> pantalla y despues los eventos, aca un ejemplo de 2 eventos...
>
>         # p_apno -3-  (Razon Social)
>         EVT_TEXT_ENTER(self, 3,self.evt_get)
>         EVT_TEXT(self, 3,self.evt_get)
>         EVT_CHAR(self.tb_apno, self.p_apno_ev_char)
>         EVT_SET_FOCUS(self.tb_apno,self.evt_skip) # toma foco...
>         EVT_KILL_FOCUS(self.tb_apno,self.p_apno_ev_df) # deja el foco...
>
>         # p_dire -4-  (Direccion)
>         EVT_TEXT_ENTER(self, 4,self.evt_get)
>         EVT_TEXT(self, 4,self.evt_get)
>         EVT_CHAR(self.tb_dire, self.p_dire_ev_char)
>         EVT_SET_FOCUS(self.tb_dire,self.evt_skip) # toma foco...
>         EVT_KILL_FOCUS(self.tb_dire,self.p_dire_ev_df) # deja el foco...
>
> Toman el evento de apno y dire y ejecutan segun lo que se pulsa las
> rutinas, tengo 2 generales que solo sacan el enter y esas cosas que son
> la evt_get y el evt_skip que ya lo tengo simplificado en una rutina,
> despues tengo las otras dos, una donde asigno variables y verifico que
> los datos cargados sea lo que quiero (fechas correctas y demases) que
> esta siempre cuando pierdo el foco o sea verifico los datos y asigno
> variables siempre que pierdo el foco no antes, por lo tanto esta rutina
> siempre va a ser unica por cada texbox pero la que quiero "simplificar"
> es la de evt_char, la que va verificando cada tecla pulsada, esto lo
> hago porque en algunos casos necesito solo poner numeros o xx cosas
> filtradas y uso estas rutinas para filtrar lo que me pulsan del teclado.
> Pero una de las cosas por lo que mas la uso es que dependiendo lo que
> pulse del teclado fuerzo a pasar al foco, para lograr que pulsando F12
> se pase el foco al proximo texbox y pulsando F11 pase el foco al textbox
> anterior, ese es el uso fundamental de las dos rutinas, aca las pongo:
>
>     # Eventos p_apno -3-
>     def  p_apno_ev_df(self,event):  # Deja Foco.
>         if len(self.tb_apno.GetValue()) <> 0:
>             self.tm_apno = self.tb_apno.GetValue()
>         else:
>             self.tm_apno = ''
>         event.Skip()
>     def p_apno_ev_char(self,event):
>        # 353 es F12 y 352 es F11  (f12 avanza, f11 retrocede)
>         key = event.GetKeyCode()
>         if key == 9 or key == 353 or key == 13: # Tecla TAB o F12 Pasa
> foco. self.tb_dire.SetFocus()
>             event.Skip()
>         if key == 352: # F11 retrocede
>             self.tb_ncli.SetFocus()
>             event.Skip()
>         if key < WXK_SPACE or key == WXK_DELETE or key > 255:
>             event.Skip()
>             return
>         event.Skip()
>
>     # Eventos p_dire -4-
>     def  p_dire_ev_df(self,event):  # Deja Foco.
>         if len(self.tb_dire.GetValue()) <> 0:
>             self.tm_dire = self.tb_dire.GetValue()
>         else:
>             self.tm_dire = ''
>         event.Skip()
>     def p_dire_ev_char(self,event):
>        # 353 es F12 y 352 es F11  (f12 avanza, f11 retrocede)
>         key = event.GetKeyCode()
>         if key == 9 or key == 353 or key == 13: # Tecla TAB o F12 Pasa
> foco. self.tb_copo.SetFocus()
>             event.Skip()
>         if key == 352: # F11 retrocede
>             self.tb_apno.SetFocus()
>             event.Skip()
>         if key < WXK_SPACE or key == WXK_DELETE or key > 255:
>             event.Skip()
>             return
>         event.Skip()
>
> Si la miran, lo unico que varia es si pulso tab, F12 o enter paso el
> evento al siguiente tb o si pulso F11 paso el foco al tb anterior.
> Esta rutina se repite en todos los tb salvo la parte que marca donde ir
> segun estas teclas, entonces se me ocurrio simplificar todo y dejar una
> sola rutina que lo haga.
> Tengo ordenado todo por orden si se fijan al asignar los tb yo no uso -1
> sino que pongo un numero asi puedo mantener un orden cuando cargo los
> datos y "marcar" el orden con que voy tomando la informacion.
> La cosa es, hay alguna manera en esta rutina de "detectar" en que orden
> estoy? asi, simplemente cuando tengo que pasar el foco al orden
> siguiente seria un setfocus +1 y cuando quiero pasar el orden al tb
> anterior seria un setfocus -1 :).

Hola, no se mucho de wx, pero podrias probar con una lambda a la hora de 
enlazar el evento, algo asi como

         EVT_CHAR(
           self.tb_apno, 
           lambda event: self.p_apno_ev_char(event,self.tb_apno) 
         )

Y la funcion p_apno_ev_char la declaras que recive un segundo parametro que es 
el ID. Si ahora tienes la precaucion de mantener una lista con los controles 
que has ido añadiendo puedes indexar sobre ella y poner el foco al que le 
toque (self.controles[index+-1].SetFocus()).

No se si es muy wx, pero te hara lo que quieres.

> Lo que necesitaria saber es como detectar en que orden estoy y ademas
> como hacer para pasar el foco no como lo estoy haciendo aca
> (sef.tb.SetFocus()) sino hacerlo directamente sobre el orden algo asi
> como self.orden.SetFocus().
>
> Bueno, Agradezco la ayuda y ademas si alguien tiene una mejor idea de
> hacer esto y me lo cuenta le estare muy agradecido.
>

Bueno, yo uso Tkinter, y la forma en que lo abordaria seria crenadome una 
clase que deriba del textbox y encapsula todo esto. Pero por desgracia no se 
siquiera si es factible hacerlo asi con wx (esta claro que todo es factible 
pero a veces es peor el remedio que la enfermedad).

Un saludo
Joaquin

> Gracias!
> Ariel

		
______________________________________________ 
Renovamos el Correo Yahoo! 
Nuevos servicios, más seguridad 
http://correo.yahoo.es




Más información sobre la lista de distribución Python-es