Development Team/Sugargame

From Sugar Labs
Jump to navigation Jump to search


Sugargame is a Python package which allows PyGame programs to run well under Sugar. It is a fork of olcpgames, which is no longer maintained.

Get it from:

What it does:

  • Wraps a Sugar activity around an existing PyGame program with few changes
  • Allows Sugar toolbars and other widgets to be added to the activity UI
  • Provides hooks for saving to and restoring from the Journal

Using Sugargame

See also Development Team/Sugargame/Examples.

Wrapping a Pygame program

To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.

The activity directory should look something like this:

  activity/            - Activity directory:, SVG icon, etc.
  sugargame/           - Sugargame package        - Activity class            - Pygame code             - Install script

To make the Activity class, start with test/ from the Sugargame distribution.

The activity must create a single PygameCanvas widget:

self._canvas = sugargame.canvas.PygameCanvas(self)

The activity may assign keyboard focus to the PygameCanvas widget, so that keyboard events generate pygame events:


The activity must call the run_pygame method of the PygameCanvas widget, passing the main loop function of the Pygame program.

# Start the game running.

In your Pygame main loop, you must pump the GTK event loop:

  while gtk.events_pending():

Adding Pygame to a PyGTK activity

To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call run_pygame on it.

widget = sugargame.canvas.PygameCanvas(self)


Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the entire activity.

The argument to run_pygame is a function structured like a Pygame program. In the main loop, remember to dispatch GTK messages using gtk.main_iteration().

def main_loop():
       clock = pygame.time.Clock()
       screen = pygame.display.get_surface()

       while self.running:
           # Pump GTK messages.
           while gtk.events_pending():

           # Pump PyGame messages.
           for event in pygame.event.get():
               if event.type == pygame.QUIT:
               elif event.type == pygame.VIDEORESIZE:
                   pygame.display.set_mode(event.size, pygame.RESIZABLE)

           # Check the mouse position
           x, y = pygame.mouse.get_pos()
           # Clear Display
           screen.fill((255,255,255)) #255 for white

           # Draw stuff here

           # Flip Display
           # Try to stay at 30 FPS


For help with Sugargame, please email the Sugar Labs development list:

Sugargame is developed by Wade Brainerd <>.

It is loosely based on the source code to the olpcgames framework, developed by the One Laptop per Child project.



  • Fix bugs in event handling. (Pablo Moleri)
  • Remove reference to gtk.Socket.get_window() method, which is missing in older versions of PyGTK.


  • Initial version of Sugargame

Differences between Sugargame and olpcgames

The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar. To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop. Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.

Sugargame takes a simpler approach; it provides a way to embed Pygame into a GTK widget. The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.

Sugargame advantages:

  • Simpler code
  • More elegant interface between Pygame and GTK
  • Runs as a single thread: no thread related segfaults
  • Possible to use Sugar widgets with Pygame

Sugargame limitations:

  • No support for Pango or SVG sprites (yet)