It seems to work for me, at least with a trivial glut test:
from OpenGL.GL import * import pyglet pyglet.options['shadow_window'] = False from pyglet import gl class PygletContext(gl.Context): def __init__(self, config=None, context_share=None): self.config = config self.context_share = context_share self.canvas = None if context_share: self.object_space = context_share.object_space else: self.object_space = gl.ObjectSpace() def attach(self, canvas=None): pass def detach(self): pass def set_current(self): # XXX not per-thread gl.current_context = self # XXX gl.gl_info.set_active_context() gl.glu_info.set_active_context() # Implement workarounds if not self._info: self._info = gl.gl_info.GLInfo() self._info.set_active_context() for attr, check in self._workaround_checks: setattr(self, attr, check(self._info)) # Release textures and buffers on this context scheduled for deletion. # Note that the garbage collector may introduce a race condition, # so operate on a copy of the textures/buffers and remove the deleted # items using list slicing (which is an atomic operation) if self.object_space._doomed_textures: textures = self.object_space._doomed_textures[:] textures = (gl.GLuint * len(textures))(*textures) gl.glDeleteTextures(len(textures), textures) self.object_space._doomed_textures[0:len(textures)] = [] if self.object_space._doomed_buffers: buffers = self.object_space._doomed_buffers[:] buffers = (gl.GLuint * len(buffers))(*buffers) gl.glDeleteBuffers(len(buffers), buffers) self.object_space._doomed_buffers[0:len(buffers)] = [] class Controller(object): def __init__(self): self.test = False def onResize(self, w, h): glViewport(0, 0, w, h) […] def onUpdate(self, d): print 'onUpdate', d def draw(self): if self.test == False: self.ctx = PygletContext() self.ctx.set_current() self.label = pyglet.text.Label('Hello, world', font_name='Times New Roman', font_size=36, x=500, y=500, anchor_x='center', anchor_y='center') self.test = True #glglue sample (PyOpenGL + glut) 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() # pyglet test here gl.glMatrixMode( gl.GL_PROJECTION ) gl.glLoadIdentity() gl.glMatrixMode( gl.GL_MODELVIEW ) gl.glLoadIdentity() gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA) gl.glClear( gl.GL_COLOR_BUFFER_BIT ) gl.glClearColor(0/255, 0/255, 0/255, 0) gl.glOrtho(0, 1000, 0, 1000, 1, -1 ) gl.glBegin(gl.GL_TRIANGLES) gl.glColor4f(1.,0.,1.,0.3) gl.glVertex2f(0.0,0.0) gl.glVertex2f(500.,500.) gl.glVertex2f(1000., 0.) gl.glEnd() self.label.draw() glFlush() if __name__=="__main__": controller=Controller() import glglue.glut glglue.glut.mainloop(controller, width=640, height=480, title="sample") It also solved an issue with pyglet windowing on windows 7 (did not try other Windows versions…) with Intel chipset graphics, I was unable to open a simple window with pyglet on every PC without a "real" graphic card… After some debugging I guess it was a win32 issue, but only with some workstations having an Intel chipset (several versions), while the OpenGL stuffs seemed to run… Thank you very much for your help. I think there should be a section in pyglet documentation about how to use a custom OpenGL context, even if pyglet is intended to be library free this is very useful in some cases. I could not fix it without your hacking sample… When you want to make an OpenGL application in Python without dealing with tricky stuffs like OpenGL "*batch*" programming, then pyglet contains just what you need. Le jeudi 1 octobre 2015 12:35:26 UTC+2, Ryexander a écrit : > > you have to trick Pyglet into thinking that a context exists and use > OpenGL internal context switching. I've gotten this working in wx but the > process should work with other context providders > > The real impotent bits I'll highlight here: > > import pyglet > > # this line is very important, we're tricking pyglet into thinking there is a > context avalible > > # but we can't make it work with the shadow window that alows sharing of > > # object between contexts > > pyglet.options['shadow_window'] = False > > # now that that is set we can import gl and get on our way > > from pyglet import gl > > > This sequence must take place in this order. The shadow_window option must > be set to false before pyglet.gl is ever imported in the application.. > > Then the next step is creating a fake context opbject for pyglet to use. > Up to version 1.1.4 this was easy, New pyglet however requires a bit more > work > > if pyglet.version > "1.1.4": > > pygletcontext = PygletContext() > > else: > > pygletcontext = gl.Context() > > pygletcontext.set_current() > > > Do this BEFORE you do any work with your context like setting the blend > func etc. > If you have multiple contexts you want to work with in your GUI > application then keep your pygletcontext object handy you'll need to use > the GUI's method of setting the current context as well as the .set_current() > of the fake context to get pyglet drawing in the right context. > > Here is the class I cobbled together to trick pyglet < 1.1.4 It's mostly a > copy paste of the pyglet source for pyglet.gl.context the important bit is > after the #implement workarounds comment > > class PygletWXContext(gl.Context): > > def __init__(self, config=None, context_share=None): > > self.config = config > > self.context_share = context_share > > self.canvas = None > > if context_share: > > self.object_space = context_share.object_space > > else: > > self.object_space = gl.ObjectSpace() > > def attach(self, canvas=None): > > pass > > def detach(self): > > pass > > def set_current(self): > > # XXX not per-thread > > gl.current_context = self > > # XXX > > gl.gl_info.set_active_context() > > gl.glu_info.set_active_context() > > # Implement workarounds > > if not self._info: > > self._info = gl.gl_info.GLInfo() > > self._info.set_active_context() > > for attr, check in self._workaround_checks: > > setattr(self, attr, check(self._info)) > > # Release textures and buffers on this context scheduled for deletion. > > # Note that the garbage collector may introduce a race condition, > > # so operate on a copy of the textures/buffers and remove the deleted > > # items using list slicing (which is an atomic operation) > > if self.object_space._doomed_textures: > > textures = self.object_space._doomed_textures[:] > > textures = (gl.GLuint * len(textures))(*textures) > > gl.glDeleteTextures(len(textures), textures) > > self.object_space._doomed_textures[0:len(textures)] = [] > > if self.object_space._doomed_buffers: > > buffers = self.object_space._doomed_buffers[:] > > buffers = (gl.GLuint * len(buffers))(*buffers) > > gl.glDeleteBuffers(len(buffers), buffers) > > self.object_space._doomed_buffers[0:len(buffers)] = [] > > > And that should be it. so long as you set teh current context correctly > every time you begin work with a new context you don't need pyglet to > manage it. The down side of pyglet not managing the context is that object > can not be reused. (at least I couldn't figure out how to make it work when > I tried a few years ago. perhaps the internals are different now and it can > be done.) > > On Wednesday, September 30, 2015 at 7:13:19 AM UTC-6, dumebi bidume wrote: >> >> hello, >> >> I would like to use pyglet code within a GUI application, currently I'm >> trying to achieve that by setting pyglet context, based on some old thread >> about this… >> (for instance: >> https://groups.google.com/forum/#!topic/pyglet-users/QmXU5ssY40E) >> >> I'm using pyglet 1.2 and trying to use glglue >> <https://pypi.python.org/pypi/glglue/0.3.1> with a glut window to test >> this but I'm not able to make it work. >> >> Is there a reasonable way to get pyglet using an already created context ? >> thanks >> >> -- You received this message because you are subscribed to the Google Groups "pyglet-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to pyglet-users+unsubscr...@googlegroups.com. To post to this group, send email to pyglet-users@googlegroups.com. Visit this group at http://groups.google.com/group/pyglet-users. For more options, visit https://groups.google.com/d/optout.