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