The following example demonstrates the use of a score containing two timelines, with one starting when the other ends, and the whole score running as a loop. The first timeline rotates the rectangle as in the previous example, and the second timeline moves the rectangle horizontally.
File: main.py
import sys import clutter rect = None rotation_angle = 0 color_change_count = 0 # Rotate the rectangle and alternate its color. def on_timeline_rotation_new_frame(timeline, frame_num): global rotation_angle rotation_angle += 1 if rotation_angle >= 360: rotation_angle = 0 # Rotate the rectangle clockwise around the z axis, around it's # top-left corner rect.set_rotation(clutter.X_AXIS, rotation_angle, 0, 0, 0) # Change the color # (This is a silly example, making the rectangle flash) global color_change_count color_change_count += 1 if color_change_count > 100: color_change_count = 0 if color_change_count == 0: rect_color = clutter.Color(255, 255, 255, 153) rect.set_color(rect_color) elif color_change_count == 50: rect_color = clutter.Color(16, 64, 144, 255) rect.set_color(rect_color) # Move the rectangle. def on_timeline_move_new_frame(timeline, frame_num): x_position = rect.get_x() x_position += 1 if x_position >= 150: x_position = 0 rect.set_x(x_position) def main(): stage_color = clutter.Color(0, 0, 0, 255) rect_color = clutter.Color(255, 255, 255, 153) # Get the stage and set its size and color stage = clutter.Stage() stage.set_size(200, 200) stage.set_color(stage_color) # Add a rectangle to the stage global rect rect = clutter.Rectangle(rect_color) rect.set_size(70, 70) rect.set_position(50, 100) stage.add(rect) rect.show() # Show the stage stage.connect('destroy', clutter.main_quit) stage.show() # Create a score and add two timelines to it, # so the second timeline starts when the first one stops score = clutter.Score() score.set_loop(True) timeline_rotation = clutter.Timeline(5000) # milliseconds timeline_rotation.connect('new-frame', on_timeline_rotation_new_frame) score.append(timeline=timeline_rotation) timeline_move = clutter.Timeline(5000) # milliseconds timeline_move.connect('new-frame', on_timeline_move_new_frame) score.append(parent=timeline_rotation, timeline=timeline_move) score.start() # Start the main loop, so we can respond to events clutter.main() return 0 if __name__ == '__main__': sys.exit(main())