When integrating a clutter.Stage
s into PyGTK with cluttergtk.Embed
, you may need to scroll due to limited screen space. Normally you would add the widget inside a gtk.ScrolledWindow
but this is not possible with cluttergtk.Embed
, as PyClutter accesses the graphics hardware directly, bypassing the normal PyGTK drawing system.
Instead you should use a cluttergtk.Viewport
. Unlike gtk.ScrolledWindow
, this does not draw any scrollbars itself. Instead it uses a gtk.Adjustment
which you should also use with your own gtk.Scrollbar
widgets, or any other gtk.Range
widget, such as gtk.Scale
.
This example is a simple image viewer that allows scrolling of the image. Note the layout of the gtk.Table
, with the two scrollbars.
File: main.py
import sys import cluttergtk # must be the first to be imported import clutter import gtk def main(): stage_color = clutter.Color(97, 100, 140, 255) if len(sys.argv) != 2: raise SystemExit("Usage: python main.py <image file>") # Create a toplevel window window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_default_size(640, 480) window.connect('destroy', gtk.main_quit) # Create a table to hold the scrollbars and the clutter.Embed widget table = gtk.Table(2, 2, False) window.add(table) table.show() # Create clutter.Embed widget for the stage embed = cluttergtk.Embed() table.attach(embed, 0, 1, 0, 1, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0) embed.show() # Init the stage stage = embed.get_stage() stage.set_color(stage_color) stage.set_size(640, 480) # Create a viewport actor to be able to scroll actor. By passing NULL it # will create new GtkAdjustments viewport = cluttergtk.Viewport() stage.add(viewport) # Load image from first command line argument and add it to viewport texture = clutter.Texture(sys.argv[1]) viewport.add(texture) texture.set_position(0, 0) viewport.set_size(640, 480) # Create scrollbars and connect them to viewport h_adjustment, v_adjustment = viewport.get_adjustments() scrollbar = gtk.VScrollbar(v_adjustment) table.attach(scrollbar, 1, 2, 0, 1, 0, gtk.EXPAND | gtk.FILL, 0, 0) scrollbar.show() scrollbar = gtk.HScrollbar(h_adjustment) table.attach(scrollbar, 0, 1, 1, 2, gtk.EXPAND | gtk.FILL, 0, 0, 0) scrollbar.show() window.show() gtk.main() return 0 if __name__ == '__main__': sys.exit(main())