Changes

Jump to navigation Jump to search
Line 1: Line 1:  
==Plugins==
 
==Plugins==
 +
 +
As of Version 106, there is plugin support for Turtle Art. The basic idea is to let developers add new palettes and blocks to support additional functionality without having to make changes to any of the core Turtle Art packages. If a plugin is present, it is loaded when Turtle Art is launched and any palettes or blocks defined by the plugin are made available to the user.
 +
 +
The plugin mechanism is currently used to provide support for sensors, the camera, RFID, and the Media, Extras, and Portfolio palettes. A plugin has been [http://lists.sugarlabs.org/archive/iaep/2011-March/012715.html developed for WeDo] and additional plugins are being developed for Arduino, NXT, and GoGo.
 +
 +
===How to write a plugin===
 +
 +
To add a plugin, simply drop a file into the plugins directory. The file must end with _plugin.py and the base class in the file must be descendent from the Plugin class defined in plugin.py
 +
 +
'''Note''' that the name of your new class much match the name of the file, but with the first letter capitalized, e.g.:
 +
 +
camera_plugin.py contains:
 +
class Camera_plugin(Plugin):
 +
 +
Turtle Art called the __init__ method when starting up and traps import errors as its means to determine whether or not a plugin has the resources it needs to run. (You may want to remove this exception handler when debugging your plugin. It is in the _init_plugins method in tawindow.py.) It then calls the setup method when creating the palettes. It calls the start method whenever a stack of blocks is run and the stop method when execution is over. Also, there are methods for goto_background, return_to_foreground, and quit. (These methods are typically ignored.)
 +
 +
Adding a new palette is simply a matter of:
 +
 +
    palette = make_palette('mypalette',  # the name of your palette
 +
                          colors=["#00FF00", "#00A000"],
 +
                          help_string=_('Palette of my custom commands'))
 +
 +
For example, if we want to add a new turtle command, 'uturn', we'd use the
 +
add_block method in the Palette class.
 +
 +
    palette.add_block('uturn',  # the name of your block
 +
                      style='basic-style',  # the block style
 +
                      label=_('u turn'),  # the label for the block
 +
                      prim_name='uturn',  # code reference (see below)
 +
                      help_string=_('turns the turtle 180 degrees'))
 +
 +
    # Next, you need to define what your block will do:
 +
    # def_prim takes 3 arguments: the primitive name, the number of
 +
    # of arguments, 0 in this case, and the function to call, in this
 +
    # case, the canvas function to set the heading.
 +
    self.tw.lc.def_prim('uturn', 0, lambda self: self.tw.canvas.seth(self.tw.canvas.heading + 180))
 +
 +
 +
That's it. When you next run Turtle Art, you will have a 'uturn' block
 +
on the 'mypalette' palette.
 +
 +
You will have to create icons for the palette-selector buttons. These
 +
are kept in the icons subdirectory. You need two icons:
 +
mypaletteoff.svg and mypaletteon.svg, where 'mypalette' is the same
 +
string as the entry you used in instantiating the Palette class. Note
 +
that the icons should be the same size (55x55) as the others. (This is
 +
the default icon size for Sugar toolbars.)
    
===Turtle Art Arduino===
 
===Turtle Art Arduino===

Navigation menu