<b>Los paquetes de python, se arman así:</b><div><br></div><div>Pongo como ejemplo BiblioJAM.</div><div>Dentro tengo varios módulos, por ejemplo: JAMLabel, JAMButton, etc . . .</div><div><br></div><div><b>Entonces:</b></div>
<div><br></div><div>Generas un directorio donde estarán todos los módulos, por ejemplo, "BiblioJAM"</div><div>Dentro de ese directorio, metes todos los módulos, (JAMLabel.py, JAMButton.py, etc . . .), y creas un archivo vacío con el nombre __init__.py</div>
<div>Luego, cuando vas a utilizar algo de ese paquete, importas el paquete, mediante:</div><div><br></div><div><font class="Apple-style-span" color="#990000">import BiblioJAM</font></div><div><br></div><div>Eso importa el paquete, a través del archivo __init__.py, es decir instancia o inicializa el paquete, acá ya todo el paquete es un objeto python y puedes tratarlo como tal.</div>
<div><br></div><div>Para importar cada módulo del paquete y/o las clases dentro de ellos, debes hacer, por ejemplo:</div><div><br></div><div><font class="Apple-style-span" color="#990000">form BiblioJAM.JAMLabel import JAMLabel </font><font class="Apple-style-span" color="#000099"># Desde el paquete BiblioJAM y el módulo JAMLabel importa la clase JAMLabel</font></div>
<div><br></div><div>o también:</div><div><br></div><div><font class="Apple-style-span" color="#990000">form BiblioJAM.JAMLabel import * </font><font class="Apple-style-span" color="#000099"># Importa todas las clases del módulo JAMLabel en el paquete BiblioJAM</font></div>
<div><br></div><div>PD:</div><div>No recuerdo con certeza porque no acostumbro a hacerlo, pero estoy casi seguro que puedes definir en el __init__.py del paquete la importación de todos los módulos, con lo cual, luego, para importar JAMLabel por ejemplo, podrías hacer <span class="Apple-style-span" style="color:rgb(153,0,0)">form BiblioJAM import JAMLabel </span>en lugar de<span class="Apple-style-span" style="color:rgb(153,0,0)"> </span><span class="Apple-style-span" style="color:rgb(153,0,0)">form BiblioJAM.JAMLabel impor JAMLabel.</span></div>
<div><span class="Apple-style-span" style="color:rgb(153,0,0)"><br></span></div><div>También puedes importar un módulo renombrándolo. Esto es muy útil para las funciones y constantes globales y cosas de esas que utilizas varias veces desde distintas partes del código, para hacer esto haces así:</div>
<div><span class="Apple-style-span" style="color:rgb(153,0,0)"><br></span></div><div><span class="Apple-style-span" style="color:rgb(153,0,0)">import JAMGlobals as G</span></div><div><br></div><div>Luego, por ejemplo, si quieres ejecutar una función de ese módulo, sólo haces:</div>
<div><br></div><div><font class="Apple-style-span" color="#990000">G.funcionaejecutar()</font></div><div><br></div><div><br></div><div><br></div><div><br><br><div class="gmail_quote">El 23 de enero de 2012 12:36, Alan Jhonn Aguiar Schwyn <span dir="ltr"><<a href="mailto:alanjas@hotmail.com">alanjas@hotmail.com</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div dir="ltr">
<div><br></div>Hola!<div><br></div><div>Nosotros para el "FollowMe" le hicimos una trampita al sistema de importaciones...</div><div><br></div><div>Le agregamos "a mano" la ruta donde están nuestras librerías..</div>
<div><br></div><div>sys.path.insert(0, os.path.abspath('./lib'))</div><div><br></div><div>Con poner solo:</div><div><br></div><div><div>sys.path.insert(0, "lib")</div><div><br></div><div>Anda...</div><div>
<br></div><div>Entonces, con tener la ruta agregada, solo importás como si estuviera en "la raíz" o estuviese instalada..</div><div><br></div><div>En cuanto a tu ejemplo: from carpeta.clase import clase</div><div>
<br></div><div>Quizás lo sepas, pero yo diría: from carpeta.archivo import clase/función</div><div><br></div><div>Y para que eso te ande, en "carpeta" debe haber un __init__.py (vacío o con fruta, pero debe estar :-)</div>
<div><br></div><div>Saludos!</div><div><br></div><div>Alan</div><br><div><div></div><hr>Date: Mon, 23 Jan 2012 12:11:03 -0200<div><div class="h5"><br>From: <a href="mailto:aarias1978@gmail.com" target="_blank">aarias1978@gmail.com</a><br>
To: <a href="mailto:olpc-uruguay@lists.laptop.org" target="_blank">olpc-uruguay@lists.laptop.org</a><br>Subject: Re: [Olpc-uruguay] Consulta, creación de Activity<br><br>Les cuento que pude generar una activity con la interfaz hecha en glade, no da problemas al hacer <b>import gtk.glade</b> efectua la importación de la librería sin mayores problemas.<br>
Ahora bien, logre hacer la activity pero de una forma muy desprolija sin poder hacer separación en paquetes o directorios, basicamente puse todos los archivos en la carpeta raíz y allí no tuve más problemas. <br>
En estos momentos estoy tratando de poder darle un aspecto prolijo pues no me gusta para nada dejar todos los archivos en un mismo directorio, da una señal de caos que me desagrada, dicho lo anterior cuando me pongo a dividir en carpetas y cada archivo vaya donde corresponde, me encuentro con el problema que cuando en el codigo hago <b>from carpeta.clase import clase</b> no reconoce este comando, me da el mensaje que no existe un objeto a importar de estas características.<br>
<br>¿Como podría solucionar este problema? Indudablemente me esta faltando indicar bien donde esta cara archivo en cada carpeta.<br><br>Saludos y muchisimas gracias por todas las ideas que me han tirado realmente me han ayudado muchisimo.<br>
<br>Alvaro.<br><br><div>El 19 de enero de 2012 23:27, Flavio Danesse <span dir="ltr"><<a href="mailto:fdanesse@gmail.com" target="_blank">fdanesse@gmail.com</a>></span> escribió:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">
Si, pero a al golpe de vista nada más, import gtk.glade no te va a funcionar porque la xo no lo tiene. No recuerdo que lo tenga pero casi seguro que no, fijate a ver si puedes importarlo desde el interprete.<div><br></div>
<div><br><br><div>El 19 de enero de 2012 22:51, Alan Jhonn Aguiar Schwyn <span dir="ltr"><<a href="mailto:alanjas@hotmail.com" target="_blank">alanjas@hotmail.com</a>></span> escribió:<div><div>
<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">
<div><div dir="ltr">
<br>Es más fácil fijarse en el log de la actividad...<div><br></div><div>Busccá la actividad: Log (si está en inglés) o Registro (en español):</div><div><br></div><div><a href="http://activities.sugarlabs.org/es-ES/sugar/addon/4056" target="_blank">http://activities.sugarlabs.org/es-ES/sugar/addon/4056</a></div>
<div><br></div><div>Entra a tu actividad.. cuando diga "Failed to start" la cerrás..</div><div><br></div><div>Vas a esa actividad y buscás el id de la actividad, ej: org.ceibaljam....</div><div><br></div><div>Y te fijás que error da..</div>
<div><br></div><div>Si querés podés compartir ese archivo con la lista..</div><div><br></div><div>Se guarda en /home/olpc/.sugar/default/logs (si mal no recuerdo)</div><div><br></div><div><br></div><div>Saludos!</div><div>
<br></div><div>Alan<br><br><div><div></div><hr>Date: Thu, 19 Jan 2012 22:28:51 -0200<br>From: <a href="mailto:aarias1978@gmail.com" target="_blank">aarias1978@gmail.com</a><br>To: <a href="mailto:olpc-uruguay@lists.laptop.org" target="_blank">olpc-uruguay@lists.laptop.org</a><br>
Subject: Re: [Olpc-uruguay] Consulta, creación de Activity<div><div><br><br>Buenas noches, luego de haber seguido sus consejos y luego de ver algun ejemplo que anda en la vuelta, logre que la Xo hiciera algo, lamentablemente no tengo resuelto el asunto, aunque tengo un error para pasarles y ver si me pueden dar alguna idea de que puede estar mal.<br>
<br>Error: "Actividad failed to start"<br><br>Les paso que odifique en cada archivo.<br><br><b>setup.py</b><br><br>#!/usr/bin/env python<br>try:<br> from sugar.activity import bundlebuilder<br> bundlebuilder.start()<br>
except ImportError:<br> import os<br> os.system("find ./ | sed 's,^./,editor.activity/,g' > MANIFEST")<br> os.system('rm editor.xo')<br> os.chdir('..')<br> os.system('zip -r editor.xo editor.activity')<br>
os.system('mv editor.xo ./editor.activity')<br> os.chdir('editor.activity')<br><br><b>activity.py<br></b><br># Load GTK<br>import gtk<br><br># Load our own source code from gtktest.py<br># There you can find the main class gtktest()<br>
from VenEditor import VenEditor<br><br># Load sugar libraries<br>from sugar.activity import activity <br><br>class editorActivity(activity.Activity):<br> def __init__(self, handle):<br> activity.Activity.__init__(self, handle)<br>
self._name = handle<br><br> # Set title for our Activity<br> self.set_title('EDITOR DHA')<br><br> # Attach sugar toolbox (Share, ...)<br> toolbox = activity.ActivityToolbox(self)<br>
self.set_toolbox(toolbox)<br> toolbox.show()<br><br> # Create the main container<br> self._main_view = gtk.VBox()<br><br> # Import our class gtktest():<br><br> # Step 1: Load class, which creates gtktest.widget<br>
self.VenEditor = VenEditor()<br><br> # Step 2: Remove the widget's parent<br> if self.VenEditor.widget.parent:<br> self.VenEditor.widget.parent.remove(self.VenEditor.widget)<br> <br> # Step 3: We attach that widget to our window<br>
self._main_view.pack_start(self.VenEditor.widget)<br><br> # Display everything<br> self.VenEditor.widget.show()<br> self._main_view.show()<br> self.set_canvas(self._main_view)<br> self.show_all()<br>
<b><br>VenEditor.py<br></b><br>#! /usr/bin/env python<br># -*- coding: UTF-8 -*-<br><br># Importamos el módulo pygtk y le indicamos que use la versión 2<br>import pygtk<br>pygtk.require("2.0")<br><br># Luego importamos el módulo de gtk y el gtk.glade, este ultimo que nos sirve<br>
# para poder llamar/utilizar al archivo de glade<br>import gtk<br>import gtk.glade<br><br><br># Creamos la clase de la ventana principal del programa<br>class VenEditor:<br> def __init__(self, runaslib=True):<br> # Le decimos a nuestro programa que archivo de glade usar (puede tener<br>
# un nombre distinto del script). Si no esta en el mismo directorio del<br> # script habría que indicarle la ruta completa en donde se encuentra<br> self.elem = gtk.glade.XML("editor.glade")<br>
# Get Window<br> self.widgets = self.elem.get_widget("window1")<br> <br> # Creamos un pequeño diccionario que contiene las señales definidas en<br> # glade y su respectivo método (o llamada)<br>
signals = { "on_entry1_activate" : self.on_button1_clicked,<br> "on_button1_clicked" : self.on_button1_clicked,<br> "gtk_main_quit" : gtk.main_quit }<br>
<br> # Luego se auto-conectan las señales.<br> self.elem.signal_autoconnect(signals)<br> # Nota: Otra forma de hacerlo es No crear el diccionario signals y<br> # solo usar "self.widgets.signal_autoconnect(self)" -->Ojo con el self<br>
<br> # Ahora obtenemos del archivo glade los widgets que vamos a<br> # utilizar (en este caso son label1 y entry1)<br> self.label1 = self.elem.get_widget("label1")<br> self.entry1 = self.elem.get_widget("entry1")<br>
<br> if not runaslib:<br> self.widgets.show_all()<br> gtk.main()<br> <br> # Se definen los métodos, en este caso señales como "destroy" ya fueron<br> # definidas en el .glade, así solo se necesita definir "on_button1_clicked"<br>
def on_button1_clicked(self, widget):<br> texto = self.entry1.get_text()<br> self.label1.set_text("Hola %s" % texto)<br><br># Para terminar iniciamos el programa<br>if __name__ == "__main__":<br>
VenEditor(False)<br><b><br><br><a href="http://activity.info" target="_blank">activity.info</a><br></b>[Activity]<br>name = Editor DHA<br>service_name = org.laptop.EditoDHA<br>class = activity.editorActivity<br>icon = activity-default<br>
activity_version = 1<br>show_launcher = yes<br>license = GPLv2+<br>host_version = 1<b><br></b><br>Nuevamente, muchas gracias por el tiempo dedicado y por las ideas que me puedan dar.<br><br>SAludos.<br><br><br><div>
El 16 de enero de 2012 12:30, Alvaro Arias <span dir="ltr"><<a href="mailto:aarias1978@gmail.com" target="_blank">aarias1978@gmail.com</a>></span> escribió:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">
Bueno muchas gracias por la guía, hoy de tarde voy a hacer las pruebas con los cambios que me sugieren a ver si logro resolver el problema.<br><br>saludos, <br>Alvaro<br><br><div>El 16 de enero de 2012 12:26, Flavio Danesse <span dir="ltr"><<a href="mailto:fdanesse@gmail.com" target="_blank">fdanesse@gmail.com</a>></span> escribió:<div>
<div><br>
<blockquote style="border-left:1px #ccc solid;padding-left:1ex">Hola.<div><br></div><div>Bueno, yo nunca he usado glade, siempre escribo todo en gedit o nano, de modo que no se como se trabaja en glade ni como se cargan sus archivos en el programa, pero te oriento un poco sobre lo que necesita sugar para funcionar:</div>
<div><br></div><div><b>La ventana principal de sugar es una ventana gtk que hereda de sugar.activity.activity.Activity, así que tu ventana tiene que ser así:</b></div><div><br></div><div><font color="#990000">from sugar.activity.activity import Activity</font></div>
<div><font color="#990000"><br></font></div><div><div><font color="#990000">class AulaVirtual(Activity):</font></div><div><font color="#990000"> def __init__(self, handle):</font></div>
<div><font color="#990000"> Activity.__init__(self, handle)</font></div></div><div><br></div><div><b>Ahora bien, el contenido de esa ventana, se agrega con:</b></div><div><br></div><div> <font color="#990000">self.set_canvas(widgetcontenedor)</font></div>
<div><br></div><div>De modo que tu actividad, debiera implementar un contenedor que no sea una ventana para poder meterlo en el canvas de la ventana de sugar. Como cargas todo eso, no se :P, pero al menos acá te indico donde debe ir.</div>
<div><br></div><div>Para cargar los archivos, indicando el path correcto donde se encuentra, lo mejor es utilizar __file__ del ejecutable base de la actividad, lo cual te da la dirección de sí mismo, es decir, si en el paquete de tu actividad tienes un directorio llamado "interfaz", donde está toda la interfaz gráfica de tu aplicación, en el archivo que hereda de "activity", puede indicar el path así:</div>
<div><br></div><div><font color="#990000">DIRECTORIO_BASE= os.path.dirname(__file__) </font><font color="#000099"># devuelve el path de este archivo que se está ejecutando</font></div>
<div><font color="#990000">DIRECTORIO_INTERFAZ= os.path.join(DIRECTORIO_BASE, "interfaz")</font></div><div><br></div><div>De esta forma, te aseguras que el path siempre será correcto sin importar la localización del paquete de tu programa.</div>
<div><br></div><div><br></div><div><br></div><div><br><br><div>El 16 de enero de 2012 12:01, Alvaro Arias <span dir="ltr"><<a href="mailto:aarias1978@gmail.com" target="_blank">aarias1978@gmail.com</a>></span> escribió:<div>
<div><br>
<blockquote style="border-left:1px #ccc solid;padding-left:1ex">Hola Pablo, antes que nada muchas gracias por contestar.<br><br>Realizo los import:<br><br> import pygtk<br> pygtk.require('2.0')<br>
import gtk<br> import gtk.glade<br><br>Luego relaciono el archivo Glade:<br>
def __init__(self):<br><br> self.widgets = gtk.glade.XML("editor.glade")<br> # Obtenemos la ventana<br> self.ventana = self.widgets.get_widget("VentanaPrincipal")<br>Le conecto las Señales que voy a usar:<br>
<br> signals = {<br> "gtk_main_quit" : gtk.main_quit,<br> "on_button1_clicked" : self.btnPersonaje,<br> "on_button2_clicked" : self.btnEnemigo,<br>
"on_button3_clicked" : self.btnPlataforma,<br> "on_button4_clicked" : self.btnObjeto,<br> "on_button5_clicked" : self.btnFondo,<br> "on_toolbutton2_clicked" : self.btnAbrir,<br>
"on_toolbutton5_clicked" : self.btnAcerca}<br><br>En realidad no me da ningún error, simplemente no me muestra nada de la interface gráfica.<br>Ya hice una activity para comprobar que sigo bien el procedimiento y corroboré que lo estoy haciendo bien (esta activity es sin glade, es simplemente una ventana hecha en Gtk que muestra un botón).<br>
<br>Yo intuyo que el problema que estoy teniendo es donde cologo mis archivos glade, le estoy errando donde van localizados, pero la verdad no tengo claro donde debería ponerlos, te paso la estructura de carpetas que tengo en mi proyecto:<br>
src/<br> Editor/<br> Grafica/<br> iconos/<br> imagenes/<br> archivos.glade<br> Logica/<br> archivos.py<br>
<br>Saludos,<br>Alvaro<br><br><br><div>El 16 de enero de 2012 11:55, Pablo Moleri <span dir="ltr"><<a href="mailto:pmoleri@gmail.com" target="_blank">pmoleri@gmail.com</a>></span> escribió:<div>
<div><br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">
<pre style="font-family:arial,helvetica,sans-serif">Hola<br><br>¿Podrías mostrar la parte de código donde levantás el archivo?<br>Tendrías que hacer algo de este estilo:<br> window = gtk.glade.XML("interfaz.glade")<br>
<br>¿Qué error recibís?<br><br>Saludos,<br>Pablo<br></pre><div>2012/1/16 Alvaro Arias <span dir="ltr"><<a href="mailto:aarias1978@gmail.com" target="_blank">aarias1978@gmail.com</a>></span><br>
<blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div>
Buen día.<br><br><br>Estoy tratando de crear una
activity de la aplicación que he desarrollado, esta aplicación está
hecha en Python, para la misma use PyGtk y para facilitar la creación de
la interfaz gráfica utilice la aplicación de diseño Glade.<br>Estoy
teniendo problemas para que levante la interface dentro de la Xo, no relaciona el archivo glade , no se donde debo
referenciar el archivo glade (este archivo es un xml donde esta toda la
especificación de la Interface).<br><br>Agradezco mucho me puedan guiar.<br><br>Saludos<span><font color="#888888"><br clear="all"><br>-- <br><font size="4"><u><i><b><span style="color:rgb(51,0,153)">Alvaro</span><br>
</b></i></u></font><br>
</font></span><br></div></div>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div><br>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div></div></div><span><font color="#888888"><br><br clear="all"><br>-- <br><font size="4"><u><i><b><span style="color:rgb(51,0,153)">Alvaro</span><br></b></i></u></font><br>
</font></span><br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div></div></div><br></div>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div></div></div><span><font color="#888888"><br><br clear="all"><br>-- <br><font size="4"><u><i><b><span style="color:rgb(51,0,153)">Alvaro</span><br></b></i></u></font><br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br><font size="4"><u><i><b><span style="color:rgb(51,0,153)">Alvaro</span><br></b></i></u></font><br>
<br>_______________________________________________
Olpc-uruguay mailing list
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a></div></div></div></div> </div></div>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div></div></div><br></div>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br><font size="4"><u><i><b><span style="color:rgb(51,0,153)">Alvaro</span><br></b></i></u></font><br>
<br>_______________________________________________
Olpc-uruguay mailing list
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a></div></div></div></div> </div></div>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div><br></div>