[PyQt] QOpenGLWidget missing module PyQt5._QOpenGLFunctions_2_1

Erik Hvatum ice.rikh at gmail.com
Fri Mar 13 00:25:57 GMT 2015


On Thu, Mar 12, 2015 at 7:23 PM, Erik Hvatum <ice.rikh at gmail.com> wrote:

>
>
> On Wed, Mar 11, 2015 at 5:45 PM, Phil Thompson <
> phil at riverbankcomputing.com> wrote:
>
>> On 11/03/2015 9:30 pm, Peter Jensen wrote:
>>
>>> Hi
>>>
>>> I have a problem using the QOpenGLWidget.
>>> I get an import error concerning missing module:
>>> PyQt5._QOpenGLFunctions_2_1
>>> Among many other things, I have tried forcing OpenGL 2.0 with
>>> QSurfaceFormat() and setVersion, but it doesn’t appear to make any
>>> difference.
>>>
>>
>> If you mean that it still tries to import _QOpenGLFunctions_2_1 then you
>> haven't managed to tell it to use OpenGL 2.0.
>>
>>  Using Windows 8.1, Python 3.4.2(x32) and
>>> PyQt5-5.4.1-gpl-Py3.4-Qt5.4.1-x32
>>>
>>> Running the included example hellogl.py results in:
>>> File "C:/Python34/Lib/site-packages/PyQt5/examples/opengl/hellogl.py",
>>> line
>>> 142, in initializeGL
>>>     self.gl = self.context().versionFunctions()
>>> ImportError: No module named 'PyQt5._QOpenGLFunctions_2_1'
>>>
>>> Hellogl.py based on QGLWidget in PyQT 5.4.0 examples works.
>>>
>>> Any help that would make QOpenGLWidget work, is very welcome.
>>>
>>
>> I'm still discovering what's needed to make things work on all machines.
>> I'll add the 2.1 module in the next installer.
>>
>> Phil
>>
>
Of course, it is possible to request a lesser version functions ball.
Here's what I do (feel free to copy/paste):

 def GL():    global _GL    if _GL is None:        context =
Qt.QOpenGLContext.currentContext()        if context is not None:
      try:                _GL = context.versionFunctions()
except ImportError:                # PyQt5 v5.4.0 and v5.4.1 provide
access to OpenGL functions up to OpenGL 2.0, but we have made
      # an OpenGL 2.1 context.  QOpenGLContext.versionFunctions(..)
will, by default, attempt to return                # a wrapper around
QOpenGLFunctions2_1, which has failed in the try block above.
Therefore,                # we fall back to explicitly requesting 2.0
functions.  We don't need any of the C _GL 2.1                #
constants or calls, anyway - these address non-square shader uniform
transformation matrices and                # specification of sRGB
texture formats, neither of which we use.                vp =
Qt.QOpenGLVersionProfile()
vp.setProfile(Qt.QSurfaceFormat.CompatibilityProfile)
vp.setVersion(2, 0)                _GL = context.versionFunctions(vp)
          if not _GL:                raise RuntimeError('Failed to
retrieve OpenGL wrapper namespace.')            if not
_GL.initializeOpenGLFunctions():                raise
RuntimeError('Failed to initialize OpenGL wrapper namespace.')
return _GL

FYI, the _GL.initializeOpenGLFunctions() call is unnecessary, but my OCD
demands it.

Cheers,
Erik

PS: apologies to Phil for sending this reply directly to his email address
and not the list the first time around...
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20150312/93fab1c2/attachment.html>


More information about the PyQt mailing list