The cluttergtk.Embed
widget allows you to place a clutter.Stage
inside an
existing PyGTK window. For instance, the window might contain other PyGTK widgets allowing the user to affect the actors in
stage. Use cluttergtk.Embed()
to instantiate the widget and then add it to a container just like any
other PyGTK widget. Call embed.get_stage()
to get the clutter.Stage
from the
cluttergtk.Embed
widget so you can then use the main PyClutter API.
When using the cluttergtk.Embed
widget you should import the cluttergtk module
before the clutter module. You should use the regular gtk.main()
function to start the
mainloop rather than clutter.main()
.
For simplicity, all other examples in this document will instead use clutter.Stage()
,
but all the techniques can also be used with a stage inside the cluttergtk.Embed
widget.
PyClutter contains some useful utility functions to help you integrate your use of GTK+ and the parts you draw with PyClutter.
To embed stock or other icons into clutter you can use the cluttergtk.Texture
and the texture.from_{stock,file}()
functions. If you need to
draw in the correct theme colors then the cluttergtk.get_*_color()
functions can receive a theme color for a
gtk.Widget
in the current state and convert it to a
clutter.Color
for use with PyClutter.
The following example shows a cluttergtk.Embed
PyGTK widget and changes the stage color when a button is
clicked.
Note that this example requires the clutter-gtk-1.0
and the clutter-1.0
packages.
File: main.py
import sys import cluttergtk # must be the first to be imported import clutter import gtk already_changed = False stage = None def on_button_clicked(button): global already_changed, stage if already_changed: stage_color = clutter.Color(0, 0, 0, 255) # Black stage.set_color(stage_color) else: stage_color = clutter.Color(32, 32, 160, 255) stage.set_color(stage_color) already_changed = not already_changed return True # Stop further handling of this event def on_stage_button_press(stage, event): print "Stage clicked at (%f, %f)" % (event.x, event.y) return True # Stop further handling of this event def main (): global stage stage_color = clutter.Color(0, 0, 0, 255) # Black # Create the window and add some child widgets window = gtk.Window(gtk.WINDOW_TOPLEVEL) vbox = gtk.VBox(False, 6) window.add(vbox) vbox.show() button = gtk.Button("Change Color") vbox.pack_end(button, False, False, 0) button.show() button.connect('clicked', on_button_clicked) # Stop the application when the window is closed window.connect('hide', gtk.main_quit) # Create the clutter widget clutter_widget = cluttergtk.Embed() vbox.pack_start(clutter_widget, True, True, 0) clutter_widget.show() # Set the size of the widget, # because we should not set the size of its stage when using GtkClutterEmbed. clutter_widget.set_size_request(200, 200) # Get the stage and set its size and color stage = clutter_widget.get_stage() stage.set_color(stage_color) # Show the stage stage.show() # Connect a signal handler to handle mouse clicks and key presses on the stage stage.connect("button-press-event", on_stage_button_press) # Show the window window.show() # Start the main loop, so we can respond to events: gtk.main() return 0 if __name__ == '__main__': sys.exit(main())