The glue code which mediates between OpenGL and some GUI
Project description
glglue is the glue code which mediates between OpenGL and some GUI
Requirements
============
* Python 2.7
* Python 3.2
Features
========
* glut window
* tkinter's togl widget
* wxPython's GLCanvas widget(wxPython for python3 is not exist)
* pyQt4's qgl widget
* win32api wgl
Site
====
* http://pypi.python.org/pypi/glglue/
* https://github.com/ousttrue/glglue
Controller convention
=====================
You should implement Controller class that has follow methods.
* onUpdate
* onLeftDown
* onLeftUp
* onMiddleDown
* onMiddleUp
* onRightDown
* onRightUp
* onMotion
* onResize
* onWheel
* onKeyDown
* draw
example
::
# coding: utf-8
from OpenGL.GL import *
class Controller(object):
def __init__(self):
pass
def onResize(self, w, h):
glViewport(0, 0, w, h)
def onLeftDown(self, x, y):
print 'onLeftDown', x, y
def onLeftUp(self, x, y):
print 'onLeftUp', x, y
def onMiddleDown(self, x, y):
print 'onMiddleDown', x, y
def onMiddleUp(self, x, y):
print 'onMiddleUp', x, y
def onRightDown(self, x, y):
print 'onRightDown', x, y
def onRightUp(self, x, y):
print 'onRightUp', x, y
def onMotion(self, x, y):
print 'onMotion', x, y
def onWheel(self, d):
print 'onWheel', d
def onKeyDown(self, keycode):
print 'onKeyDown', keycode
def onUpdate(self, d):
print 'onUpdate', d
def draw(self):
glClearColor(0.9, 0.5, 0.0, 0.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBegin(GL_TRIANGLES)
glVertex(-1.0,-1.0)
glVertex( 1.0,-1.0)
glVertex( 0.0, 1.0)
glEnd()
glFlush()
if __name__=="__main__":
controller=Controller()
import glglue.glut
glglue.glut.mainloop(controller)
#import glglue.wgl
#glglue.wgl.mainloop(controller, width=640, height=480, title="sample")
Samples
=======
glut
----
requrie pyOpenGL + glut install
glut install on Windows
~~~~~~~~~~~~~~~~~~~~~~~
1) download glut-3.7.6-bin.zip from http://user.xmission.com/~nate/glut.html
2) copy glut32.dll to C:/PythonXX/
::
import glglue.sample
import glglue.glut
if __name__=="__main__":
controller=glglue.sample.SampleController()
glglue.glut.mainloop(controller)
tkinter
-------
requrie pyOpenGL + togl install
Togl install on Windows
~~~~~~~~~~~~~~~~~~~~~~~
1) download Togl2.0-8.4-Windows.zip from http://sourceforge.net/projects/togl/files/Togl/2.0/
2) copy Togl2.0-8.4-Windows/lib/Togl2.0 to C:/PythonXX/tcl/Togl2.0
::
import sys
import Tkinter as tkinter
import glglue.togl
import glglue.sample
class Frame(tkinter.Frame):
def __init__(self, width, height, master=None, **kw):
#super(Frame, self).__init__(master, **kw)
tkinter.Frame.__init__(self, master, **kw)
# setup opengl widget
self.controller=glglue.sample.SampleController()
self.glwidget=glglue.togl.Widget(
self, self.controller, width=width, height=height)
self.glwidget.pack(fill=tkinter.BOTH, expand=True)
# event binding(require focus)
self.bind('<Key>', self.onKeyDown)
self.bind('<MouseWheel>', lambda e: self.glworld.onWheel(-e.delta) and self.glwidget.onDraw())
def onKeyDown(self, event):
key=event.keycode
if key==27:
# Escape
sys.exit()
if key==81:
# q
sys.exit()
else:
print("keycode: %d" % key)
f = Frame(width=600, height=600)
f.pack(fill=tkinter.BOTH, expand=True)
f.focus_set()
f.mainloop()
wxPython
--------
require pyOpenGL + wxPython
::
import wx
import glglue.sample
import glglue.wxglcanvas
class Frame(wx.Frame):
def __init__(self, parent, **kwargs):
super(Frame, self).__init__(parent, **kwargs)
# setup opengl widget
self.controller=glglue.sample.SampleController()
self.glwidget=glglue.wxglcanvas.Widget(self, self.controller)
# packing
sizer=wx.BoxSizer(wx.HORIZONTAL)
self.SetSizer(sizer)
sizer.Add(self.glwidget, 1, wx.EXPAND)
app = wx.App(False)
frame=Frame(None, title='glglue')
frame.Show()
app.MainLoop()
pyQt4
-----
require pyOpenGL + pyQt4
::
from PyQt4 import Qt
import glglue.sample
import glglue.qgl
class Window(Qt.QWidget):
def __init__(self, parent=None):
Qt.QWidget.__init__(self, parent)
# setup opengl widget
self.controller=glglue.sample.SampleController()
self.glwidget=glglue.qgl.Widget(self, self.controller)
# packing
mainLayout = Qt.QHBoxLayout()
mainLayout.addWidget(self.glwidget)
self.setLayout(mainLayout)
import sys
app = Qt.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
pyGame
------
require pyOpenGL + pyGame
::
import pygame
from pygame.locals import *
import glglue.sample
if __name__=="__main__":
pygame.init()
size=(640, 480)
screen = pygame.display.set_mode(size,
HWSURFACE | OPENGL | DOUBLEBUF)
controller=glglue.sample.SampleController()
controller.onResize(*size)
clock = pygame.time.Clock()
is_running=True
while is_running:
# event handling
for event in pygame.event.get():
if event.type == QUIT:
is_running=False
if event.type == KEYUP and event.key == K_ESCAPE:
is_running=False
pressed = pygame.key.get_pressed()
time_passed = clock.tick()
# Show the screen
controller.draw()
pygame.display.flip()
win32api
--------
require pyOpenGL + pywin32(win32con)
pywin32(win32con) install on Windows
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1) download pywin32-*.exe from http://sourceforge.net/projects/pywin32/files/pywin32/
2) execute installer
::
import glglue.sample
import glglue.wgl
if __name__=="__main__":
factory=glglue.wgl.WindowFactory()
window=factory.create(glglue.wgl.Window, title="sample")
window.createGLContext(16)
window.controller=glglue.sample.SampleController()
window.show()
import sys
sys.exit(factory.loop())
short smaple
::
import glglue.sample
import glglue.wgl
if __name__=="__main__":
controller=glglue.sample.SampleController()
glglue.wgl.mainloop(controller, width=640, height=480, title="sample")
History
=======
* 20120119 0.2.0 python3 support
* 20120119 0.1.3 add SetFocus when mouseDown on wxglcanvas
* 20120115 0.1.2 update README. add MANIFEST.in
* 20120114 0.1.1 update README
* 20120114 0.1.0 implement wxglcanvas mouse event and keyboard event handling
* 20120113 0.0.9 fix wxglcanvas
* 20120112 0.0.8 fix lacking of README.rst
* 20111230 0.0.7 add wgl.mainloop, implement wgl mouse callback
* 20111230 0.0.4 fix SetWindowLongPtr
* 20111229 0.0.3 include glglue.sample. add wgl
Requirements
============
* Python 2.7
* Python 3.2
Features
========
* glut window
* tkinter's togl widget
* wxPython's GLCanvas widget(wxPython for python3 is not exist)
* pyQt4's qgl widget
* win32api wgl
Site
====
* http://pypi.python.org/pypi/glglue/
* https://github.com/ousttrue/glglue
Controller convention
=====================
You should implement Controller class that has follow methods.
* onUpdate
* onLeftDown
* onLeftUp
* onMiddleDown
* onMiddleUp
* onRightDown
* onRightUp
* onMotion
* onResize
* onWheel
* onKeyDown
* draw
example
::
# coding: utf-8
from OpenGL.GL import *
class Controller(object):
def __init__(self):
pass
def onResize(self, w, h):
glViewport(0, 0, w, h)
def onLeftDown(self, x, y):
print 'onLeftDown', x, y
def onLeftUp(self, x, y):
print 'onLeftUp', x, y
def onMiddleDown(self, x, y):
print 'onMiddleDown', x, y
def onMiddleUp(self, x, y):
print 'onMiddleUp', x, y
def onRightDown(self, x, y):
print 'onRightDown', x, y
def onRightUp(self, x, y):
print 'onRightUp', x, y
def onMotion(self, x, y):
print 'onMotion', x, y
def onWheel(self, d):
print 'onWheel', d
def onKeyDown(self, keycode):
print 'onKeyDown', keycode
def onUpdate(self, d):
print 'onUpdate', d
def draw(self):
glClearColor(0.9, 0.5, 0.0, 0.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBegin(GL_TRIANGLES)
glVertex(-1.0,-1.0)
glVertex( 1.0,-1.0)
glVertex( 0.0, 1.0)
glEnd()
glFlush()
if __name__=="__main__":
controller=Controller()
import glglue.glut
glglue.glut.mainloop(controller)
#import glglue.wgl
#glglue.wgl.mainloop(controller, width=640, height=480, title="sample")
Samples
=======
glut
----
requrie pyOpenGL + glut install
glut install on Windows
~~~~~~~~~~~~~~~~~~~~~~~
1) download glut-3.7.6-bin.zip from http://user.xmission.com/~nate/glut.html
2) copy glut32.dll to C:/PythonXX/
::
import glglue.sample
import glglue.glut
if __name__=="__main__":
controller=glglue.sample.SampleController()
glglue.glut.mainloop(controller)
tkinter
-------
requrie pyOpenGL + togl install
Togl install on Windows
~~~~~~~~~~~~~~~~~~~~~~~
1) download Togl2.0-8.4-Windows.zip from http://sourceforge.net/projects/togl/files/Togl/2.0/
2) copy Togl2.0-8.4-Windows/lib/Togl2.0 to C:/PythonXX/tcl/Togl2.0
::
import sys
import Tkinter as tkinter
import glglue.togl
import glglue.sample
class Frame(tkinter.Frame):
def __init__(self, width, height, master=None, **kw):
#super(Frame, self).__init__(master, **kw)
tkinter.Frame.__init__(self, master, **kw)
# setup opengl widget
self.controller=glglue.sample.SampleController()
self.glwidget=glglue.togl.Widget(
self, self.controller, width=width, height=height)
self.glwidget.pack(fill=tkinter.BOTH, expand=True)
# event binding(require focus)
self.bind('<Key>', self.onKeyDown)
self.bind('<MouseWheel>', lambda e: self.glworld.onWheel(-e.delta) and self.glwidget.onDraw())
def onKeyDown(self, event):
key=event.keycode
if key==27:
# Escape
sys.exit()
if key==81:
# q
sys.exit()
else:
print("keycode: %d" % key)
f = Frame(width=600, height=600)
f.pack(fill=tkinter.BOTH, expand=True)
f.focus_set()
f.mainloop()
wxPython
--------
require pyOpenGL + wxPython
::
import wx
import glglue.sample
import glglue.wxglcanvas
class Frame(wx.Frame):
def __init__(self, parent, **kwargs):
super(Frame, self).__init__(parent, **kwargs)
# setup opengl widget
self.controller=glglue.sample.SampleController()
self.glwidget=glglue.wxglcanvas.Widget(self, self.controller)
# packing
sizer=wx.BoxSizer(wx.HORIZONTAL)
self.SetSizer(sizer)
sizer.Add(self.glwidget, 1, wx.EXPAND)
app = wx.App(False)
frame=Frame(None, title='glglue')
frame.Show()
app.MainLoop()
pyQt4
-----
require pyOpenGL + pyQt4
::
from PyQt4 import Qt
import glglue.sample
import glglue.qgl
class Window(Qt.QWidget):
def __init__(self, parent=None):
Qt.QWidget.__init__(self, parent)
# setup opengl widget
self.controller=glglue.sample.SampleController()
self.glwidget=glglue.qgl.Widget(self, self.controller)
# packing
mainLayout = Qt.QHBoxLayout()
mainLayout.addWidget(self.glwidget)
self.setLayout(mainLayout)
import sys
app = Qt.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
pyGame
------
require pyOpenGL + pyGame
::
import pygame
from pygame.locals import *
import glglue.sample
if __name__=="__main__":
pygame.init()
size=(640, 480)
screen = pygame.display.set_mode(size,
HWSURFACE | OPENGL | DOUBLEBUF)
controller=glglue.sample.SampleController()
controller.onResize(*size)
clock = pygame.time.Clock()
is_running=True
while is_running:
# event handling
for event in pygame.event.get():
if event.type == QUIT:
is_running=False
if event.type == KEYUP and event.key == K_ESCAPE:
is_running=False
pressed = pygame.key.get_pressed()
time_passed = clock.tick()
# Show the screen
controller.draw()
pygame.display.flip()
win32api
--------
require pyOpenGL + pywin32(win32con)
pywin32(win32con) install on Windows
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1) download pywin32-*.exe from http://sourceforge.net/projects/pywin32/files/pywin32/
2) execute installer
::
import glglue.sample
import glglue.wgl
if __name__=="__main__":
factory=glglue.wgl.WindowFactory()
window=factory.create(glglue.wgl.Window, title="sample")
window.createGLContext(16)
window.controller=glglue.sample.SampleController()
window.show()
import sys
sys.exit(factory.loop())
short smaple
::
import glglue.sample
import glglue.wgl
if __name__=="__main__":
controller=glglue.sample.SampleController()
glglue.wgl.mainloop(controller, width=640, height=480, title="sample")
History
=======
* 20120119 0.2.0 python3 support
* 20120119 0.1.3 add SetFocus when mouseDown on wxglcanvas
* 20120115 0.1.2 update README. add MANIFEST.in
* 20120114 0.1.1 update README
* 20120114 0.1.0 implement wxglcanvas mouse event and keyboard event handling
* 20120113 0.0.9 fix wxglcanvas
* 20120112 0.0.8 fix lacking of README.rst
* 20111230 0.0.7 add wgl.mainloop, implement wgl mouse callback
* 20111230 0.0.4 fix SetWindowLongPtr
* 20111229 0.0.3 include glglue.sample. add wgl
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
glglue-0.2.0.zip
(20.0 kB
view hashes)