1. NodeBox 1
    1. Homepage
    2. NodeBox 3Node-based app for generative design and data visualization
    3. NodeBox OpenGLHardware-accelerated cross-platform graphics library
    4. NodeBox 1Generate 2D visuals using Python code (Mac OS X only)
  2. Gallery
  3. Documentation
  4. Forum
  5. Blog


NodeBox is designed to output PDF documents or images, when you want to do all sorts of moving and interactive things you're probably better off with a tool like Processing.

However, if you do want to experiment with interactivity in NodeBox, there's some built-in support that might be of help to you. This assumes you already know how to make an animation in NodeBox.

Interacting with the mouse

In a NodeBox animation, there are three predefined variables that store the current position of the mouse cursor and the state of the mouse button:

  • MOUSEX: the horizontal location of the mouse cursor
  • MOUSEY: the vertical location of the mouse cursor
  • mousedown: is True when the mouse button is pressed, False otherwise

You would typically use the mousedown variable in an if-statement:

if mousedown:
     # do stuff when the mouse is pressed
     # do stuff when the mouse isn't pressed

Interacting with the keyboard

Three predefined variables store the keys a user is pressing during a NodeBox animation:

  • key: the last key pressed
  • keycode: the integer keycode of the last key pressed
  • keydown: is True when a key is being pressed, False otherwise

The key and keycode variables are updated as long as any key is being pressed.

KEY_UP, KEY_DOWN_ KEY_LEFT, KEY_RIGHT, KEY_BACKSPACE contain the keycodes for the arrow keys and the backspace key.


A fun example is this little sketch application. Simply run the code and draw some stuff on the canvas! interaction-sketch

Play movie

size(400 ,400)
def setup():
    global path, d
    path = []
def draw():
    global path
    if mousedown:
        pt = Point(MOUSEX, MOUSEY)
    if len(path) > 0:
        first = True
        for pt in path:
            if first:
                beginpath(pt.x, pt.y)
                first = False
                lineto(pt.x, pt.y)