Clutter: capturing key eventsΒΆ

The following example shows how to capture key presses in Clutter. The example if heavily based on snippet from Nick Veitch:

#!/usr/bin/env python
#! -*- coding: utf-8 -*-

from gi.repository import Clutter
import sys

# define some colours (takes RGBA values)
red = Clutter.Color().new(255,0,0,255)
green = Clutter.Color().new(0,255,0,255)
blue = Clutter.Color().new(0,0,255,255)
black = Clutter.Color().new(0,0,0,255)
white = Clutter.Color().new(255,255,255,255)

# Define a callback method for key presses
def keyPress(self, event):
    # Parses the keyboard input generated by a callback from the Stage object
    # The event object has the property 'keyval'
    # clutter also defines constants for keyvals
    # so we can use these to compare
    if event.keyval == Clutter.q:
        #if the user pressed "q" quit the test
        Clutter.main_quit()
    elif event.keyval == Clutter.r:
        #if the user pressed "r" make the actor red
        text_actor.set_color(red)
        text_actor.set_text("This is Red")
    elif event.keyval == Clutter.g:
        #if the user pressed "g" make the actor green
        text_actor.set_color(green)
        text_actor.set_text("This is Green")
    elif event.keyval == Clutter.b:
        #if the user pressed "b" make the actor blue
        text_actor.set_color(blue)
        text_actor.set_text("This is Blue")
    elif event.keyval == Clutter.Up:
        # 'Up' is equal to the cursor up key
        stage.set_color(black)
    elif event.keyval == Clutter.Down:
        # 'Down' is equal to the cursor down key
        stage.set_color(white)
    #event feedback, useful for working out values of tricky keys
    print('event processed',  event.keyval)

if __name__ == '__main__':
   Clutter.init( sys.argv )

   # Stage creation
   stage = Clutter.Stage()
   stage.set_size(450, 180)
   stage.set_color(black)

   # Text Actor
   text_actor=Clutter.Text()
   text_actor.set_color(red)
   text_actor.set_position(20,70)
   text_actor.set_font_name('Sans 24')
   text_actor.set_text('Press a Key:\nUp, Down, r, g, b, q')

   # Add the actor to the stage
   stage.add_actor( text_actor )

   # Show the stage
   stage.show_all()

   # Connect signals
   stage.connect("destroy",lambda w: Clutter.main_quit() )
   stage.connect('key-press-event', keyPress)

   # Pass execution to the main clutter loop
   Clutter.main()