llamar a modulos desde menu

dvilla en gmx.net dvilla en gmx.net
Sab Dic 27 18:43:24 CET 2003


Hola:

Creo que yo tengo un problema similar. A ver que te parece como lo he resuelto. 

Podrías considerar cada juego como un pluggin. Te construyes una "factoría
abstracta". Importas todos los módulos que implementan juegos (*2). Los módulos
se registran en la factoría automáticamente al cargarse (*3). De ese modo el
menú de juegos se construye automáticamente con los juegos registrados y no
tienes que modificar el programa principal para añadir nuevos juegos. 

Esto se conoce como el patrón "Factory Method" o constructor virtual, es
realmente potente y no debería depender del directorio en que lo pongas mientras
la estructura se mantenga. La factoría debe ser un "singleton". Te aconsejo que
mires [1].

[1] http://jamesthornton.com/eckel/TIPython/html/Sect08.htm

(*2) Carga de módulos
Sería algo así:
--------------------------------
for m in glob.glob('juego_*.py'):
     print 'Trying to load', m
     m = m[:m.find('.')] # para quitar la extensión
     fp, pathname, desc = imp.find_module(m)
     imp.load_module(m, fp, pathname, desc)
--------------------------------

(*3) Registrado de un juego
--- fichero juego_parchis.py ---
import factory 

# código del juego
...
...

factory.add('parchis', juego_parchis)
--------------------------------

Si crees que te vale, dímelo y te hago un ejemplo mínimo completo. No sé si esta
es la respuesta ADECUADA, sólo intento ayudar.

Saludos






El Fri, 26 Dec 2003 05:54:35 -0700
fermunyoz en softhome.net escribió:

> HL a todos. 
> 
> Estoy realizando una serie de juegos con pygame,y tengo un menu para 
> llamarles  a todos y tb a unos archivos de funciones,con una estructura de 
> directorios como esta: 
> 
> /root/juegos/
>             /juego1/
>                    juego1.py
>                    juego11.py
>                    ....py
>             /juego2/
>                    juego2.py
>                    ....py
>             /juego3/
>                    ....py
>              .....
>             /datos/
>                 imagenes/
>                 sonidos/
>             /lib/
>                 herramienta1.py
>                 .....py 
> 
>             menu.py
> 
> Todos los juegos estan dentro de una funcion:
>  def main():
>             .....
>             .....
>  if __name__ == '__main__': main() 
> 
> Asi para llamr a un juego desde otro juego dentro del mismo directorio hacia 
> lo siguiente: 
> 
> import juego11 
> 
>    juego11.main() 
> 
> Para lllamarles desde el menu y asi solo teer que ejecutar el menu e ir 
> caragando cada juwgo desde el mismo menu,he creado un archivo menu.py con 
> una serie de botones que hace lo siguiente: 
> 
> #para situarnos en /root/juegos/
> dir=os.path.abspath(sys.argv[0])
> bajar=os.path.split(dir)[0]
> os.chdir(bajar) 
> 
> def main():
>           #si pulsamos el boton deun juego en concreto (juego1)
>            juego1=os.path.join(bajar,'juego1') #directorio del primer juego
> 	    os.chdir(juego1)             #nos situamos en ese directorio
> 	    sys.path.append(juego1)      #añadimos al pythonpath
> 	    import juego1     #imprtamos solo el 1º q es el unico q qeremos (los
> 	    
> demas los llamamos a parti de este) 
> 
> if __name__ == '__main__': main() 
> 
> Tambien dentro de cada primer juego antes de la funcion pricipal hago esto: 
> 
> dir=os.path.abspath('')
> bajar=os.path.split(dir)[0]
> os.chdir(bajar) 
> 
> para situarnos en el direcctorio /root/juegos/, y asi poder llamar a los 
> modulos de datos/ y lib/ (librerias usadas por todos los juegos). 
> 
> Weno hasta ahora no tenia ningun problemay todo funciona bien, pero el 
> problema viene cuando desde cada juego que he puesto un boton para ir al 
> menu haciendo: 
> 
> import menu 
> 
> #si apreto el boton de menu
> menu.main() 
> 
> Y la verdad es q me carga el menu correctamente(vuelve al menu), pero aki es 
> donde viene el problema, que cuando vuelvo a querer entrar en un juego otra 
> vez desde el menu apretando un boton me da un error y se sale del programa: 
> 
> OSError: [Errno 2] No such file or directory: '/root/juegos/juego1/juego1' 
> 
> El problema es que se queda un nivel de directorios mas arriba que el de 
> /root/juegos/ se queda en /root/juegos/juego1, y a partir de alli buscael 
> siguiente juego(juego1 en est caso).
> He probado ya muchisimas cosas y se q ahcer mas por eso lo pongo en la lista 
> haber si hay alguien q me pueda ayudar pq estoy un poko desesperado ya. 
> 
> Agradeceria la ayuda para solcionar esto, o si alguien conoce otras formas 
> aunq no sean mas sencillas de ir llamando a los modulos desde un menu y 
> volver al mismo, con esta estructura de directorios, o si alguien tiene ago 
> parecido si puediera enviarme el codigo explicandome un poko como lo hizo se 
> lo agradeceria pq stoy estancao ya. 
> 
> GRACIAS
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
> 




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