Activity tutorial
<< Tutorials
Este tutorial explica paso a paso como crear la Actividad Hola Mundo en un conjunto. Puedes descargar un paquete completo .xo, aunque el paquete no sera exactamente identico al que esta a continuación.
Este tutorial asume que has leido el Manual del Desarrollador, has instalado un ambiente de desarrollo de Sugar y deseas desarrollar en PyGTK (el estandar de desarrollo para actividades en OLPC).
Comenzando
- Crea una estructura de directorios:
mkdir -p HelloWorldActivity.activity/activity
- Escribe el archivo activity.info, para describir el conjunto dentro del sub-directorio de una actividad (e.g. HelloWorldActivity.activity/activity/activity.info). La especificación del Activity Bundles explica en detalle el significado de cada campo.
- Nota: en la compilación joyride-1525, sugar no pudo localizar el icono cuando intente esto asi que elimine la extension '.svg' de la linea 'icon = activity-helloworld.svg'.
File: activity.info |
[Activity] name = HelloWorld bundle_id = org.laptop.HelloWorldActivity class = HelloWorldActivity.HelloWorldActivity icon = activity-helloworld activity_version = 1 host_version = 1 show_launcher = yes |
- Diseña un icono para la actividad siguiendo las instrucciones en creando iconos para Sugar y ponlo en el subdirectorio de la actividad. El nombre del archivo debe ser igual al nombre del archivo de icono especificado en el archivo de información (e.g. activity-helloworld.svg). El contenido del archivo SVG se vera así:
File: activity-helloworld.svg |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY stroke_color "#666666"> <!ENTITY fill_color "#FFFFFF"> ]> <svg xmlns="http://www.w3.org/2000/svg" width="55" height="55"> <rect x="5" y="5" width="45" height="45" style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5"/> </svg> |
- Escribe el script setup.py en el directorio raíz (e.g. HelloWorldActivity.activity/setup.py), el cual en muchas ocaciones se vera de esta forma:
File: setup.py |
#!/usr/bin/env python from sugar.activity import bundlebuilder bundlebuilder.start() |
Una versión avanzada, la cual soporta la creacion de actividades sin Sugar previamente instalado, se vera de esta forma:
File: setup.py |
#!/usr/bin/env python try: from sugar.activity import bundlebuilder bundlebuilder.start() except ImportError: import os os.system("find ./ | sed 's,^./,HelloWorldActivity.activity/,g' > MANIFEST") os.system('rm HelloWorldActivity.xo') os.chdir('..') os.system('zip -r HelloWorldActivity.xo HelloWorldActivity.activity') os.system('mv HelloWorldActivity.xo ./HelloWorldActivity.activity') os.chdir('HelloWorldActivity.activity') |
- Code your activity in Python. The name you specified in the .info file as "class" is the name of the class which runs your code. For the activity.info file above, we specify a top-level module named HelloWorldActivity.HelloWorldActivity (please note that the use of uppercase names in module names is considered poor Python style, feel free to use an activity name with more standard style names).
File: HelloWorldActivity.py |
from sugar.activity import activity import logging import sys, os import gtk class HelloWorldActivity(activity.Activity): def hello(self, widget, data=None): logging.info('Hello World') def __init__(self, handle): print "running activity init", handle activity.Activity.__init__(self, handle) print "activity running" # Creates the Toolbox. It contains the Activity Toolbar, which is the # bar that appears on every Sugar window and contains essential # functionalities, such as the 'Collaborate' and 'Close' buttons. toolbox = activity.ActivityToolbox(self) self.set_toolbox(toolbox) toolbox.show() # Creates a new button with the label "Hello World". self.button = gtk.Button("Hello World") # When the button receives the "clicked" signal, it will call the # function hello() passing it None as its argument. The hello() # function is defined above. self.button.connect("clicked", self.hello, None) # Set the button to be our canvas. The canvas is the main section of # every Sugar Window. It fills all the area below the toolbox. self.set_canvas(self.button) # The final step is to display this newly created widget. self.button.show() print "AT END OF THE CLASS" |
The above file is called HelloWorldActivity.py
- Create a MANIFEST (e.g. HelloWorldActivity.activity/MANIFEST), containing the list of the files (relative to the directory that the MANIFEST is in) to include in the package. (Note: Be sure not to leave blank lines at the end of the file.) This script does that in linux (run it from within the HellowWorldActivity.activity directory):
cd HelloWorldActivity.activity find . -type f | sed 's,^./,,g' > MANIFEST
- Your directory structure should now look like this:
HelloWorldActivity.activity/ HelloWorldActivity.activity/setup.py HelloWorldActivity.activity/activity HelloWorldActivity.activity/activity/activity.info HelloWorldActivity.activity/activity/activity-helloworld.svg HelloWorldActivity.activity/HelloWorldActivity.py HelloWorldActivity.activity/MANIFEST
- Make sure that all your python files have the required permissions to be used.
chmod a+x setup.py chmod a+x HelloWorldActivity.py
- Setup your bundle for development (must be user olpc when you do this) to become user olpc, type: su - olpc
If you are prompted for a password, trying using: su
python setup.py dev
This just creates a symlink to your activity folder in ~/Activities, so that Sugar can find your activity.
- Restart Sugar using Ctrl-Alt-Erase and your activity will appear in the interface! (NOTE: By default, the Home view shows only the favorite activities. You should press Ctrl+2 or go the right-upper corner and change to the List View)
- Run your activity, and if there are errors use the Log viewer activity to see what went wrong.
Ejecutando
Si ejecutas ahora Sugar el icono de la actividad sear visible en el marco. (Deberás reiniciar sugar para que coja los cambios si aun lo instalaste. Haz clic en ctrl-alt-erase.)
Tambien podras editar el codigo en tu conjunto de directorios de manera directa. Nota que la primera vez que lanzas la Actividad, dejara procesos activos aun si cierras la ventana, deberas matar el sugar-activity-factory para que recargue cuando hagas clic de nuevo.
Distribución
Crea un paquete .xo para distribuir el conjunto. (Un archivo .xo es esencialmente un archvio zip creado a base del MANIFEST con metadatos extras, de forma similar a un archivo JAR. También tiene una forma de localización, y en el futuro esperamos que sea posible firmar los paquetes tambien.) El nombre de conjunto es automaticamente generado desde los valores 'name' y 'activity_version' encontrados en el archivo activity.info, separado por un guión, con una extensión .xo.
./setup.py dist_xo
Para instalar la xo en una laptop puedes usar el script de instalación.
sugar-install-bundle HelloWorld-1.xo
Trouble Shooting
You can find application logs in /home/olpc/.sugar/default/logs. If the sample fails to compile, sugar will show you the icon in the circle but remain forever at the "Starting..." tag when you hover your mouse over it. You'll have to restart sugar with <ctrl-alt-erase> in order to remove the icon. You can find the cause of your trouble in the the log named for the "service-name" in your activity.info file, in this case "org.laptop.HelloWorldActivity".
See also
- Activity bundles
- Hacking Sugar
- Localization -- you will need to localize your activity to make it accessible to users of the OLPC
- Game development HOWTO
- Textedit Activity - simple text editor to support development and testing on the Xo