To clarify my previous post a little I have made a simple example on how to use Rabbyt library with GTK GL Extension. Hope this helps. Cheers all…
# /usr/bin/env python # # Rabbyt GTK GLext test # __author__ = 'Karol "Wolverine" Tomala' __email__ = 'karol (at) karoltomala (dot) com' # Imports import sys import pygtk pygtk.require('2.0') import gtk import gtk.gtkgl import gobject import rabbyt # Globals angle = 0.0 sprite = None zfactor = 0.005 zoom = 1.0 # Drawing function def draw(glarea, event): # Get surface and context glcontext = glarea.get_gl_context() gldrawable = glarea.get_gl_drawable() # Start opengl context if not gldrawable.gl_begin(glcontext): return # Actual drawing global sprite, angle, zoom # Clear screen rabbyt.clear((0.0, 0.0, 0.0)) # Render sprite if sprite is not None: sprite.rot = angle sprite.scale = zoom sprite.render() # Flush screen gldrawable.swap_buffers() # End opengl context gldrawable.gl_end() return True # Resizing function def reshape(glarea, event): # Get surface and context glcontext = glarea.get_gl_context() gldrawable = glarea.get_gl_drawable() # Start opengl context if not gldrawable.gl_begin(glcontext): return # Get widget dimensions x, y, width, height = glarea.get_allocation() # Reset rabbyt viewport rabbyt.set_viewport((width, height)) rabbyt.set_default_attribs() # End opengl context gldrawable.gl_end() return True # Initialization function def init(glarea): # Get surface and context glcontext = glarea.get_gl_context() gldrawable = glarea.get_gl_drawable() # Start opengl context if not gldrawable.gl_begin(glcontext): return # Get widget dimensions x, y, width, height = glarea.get_allocation() # Reset rabbyt viewport rabbyt.set_viewport((width, height)) rabbyt.set_default_attribs() # Get sprite variable global sprite # Load sprite sprite = rabbyt.Sprite('sprite.png') # End opengl context gldrawable.gl_end() return True # Idle function def idle(glarea): # Get vars global angle, zoom, zfactor # Update angle angle += 1.0 if angle > 359: angle = 0.0 # Update zoom if zoom > 10 or zoom < 1: zfactor = -zfactor zoom += zfactor # Needed for synchronous updates glarea.window.invalidate_rect(glarea.allocation, False) glarea.window.process_updates(False) return True # Map events function def map(glarea, event): # Add idle event gobject.idle_add(idle, glarea) return True # Create opengl configuration try: # Try creating rgb, double buffering and depth test modes for opengl glconfig = gtk.gdkgl.Config(mode = (gtk.gdkgl.MODE_RGB | gtk.gdkgl.MODE_DOUBLE | gtk.gdkgl.MODE_DEPTH)) except: # Failed, so quit sys.exit(0) # Create window win = gtk.Window() win.set_title('Rabbyt GTK test') if sys.platform != 'win32': win.set_resize_mode(gtk.RESIZE_IMMEDIATE) win.set_reallocate_redraws(True) win.connect('destroy', gtk.main_quit) # Create vertical packing box vbox = gtk.VBox() win.add(vbox) vbox.show() # Create our glarea widget glarea = gtk.gtkgl.DrawingArea(glconfig) glarea.set_size_request(300, 300) glarea.connect_after('realize', init) glarea.connect('configure_event', reshape) glarea.connect('expose_event', draw) glarea.connect('map_event', map) vbox.pack_start(glarea) glarea.show() # Create button quit btn = gtk.Button('Quit') btn.connect('clicked', gtk.main_quit) vbox.pack_start(btn, expand = False) btn.show() # Show window win.show() # We're finished, enter main gtk loop gtk.main() # Go get some pizza :)