Skip to content
A cross platform helper library for ModernGL making window creation and resource loading simple
Python GLSL
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs WindowConfig: Allow setting vsync Jan 10, 2020
examples Example: Instanced rendering Jan 12, 2020
extras release typo Nov 15, 2019
.gitignore Update .gitignore Nov 20, 2019
setup.cfg Update setup.cfg Oct 10, 2019
tox.ini Update flake8 filters Nov 10, 2019

pypi rtd


A cross platform helper library for ModernGL making window creation and resource loading simple. It can also be used with PyOpenGL for rendering with the programmable pipeline.

Please report bugs or post questions/feedback on github.


  • Cross platform support. Tested on Windows 10, Linux and Mac OS X. This can save users a lot of time and is often more difficult than most people imagine it to be.
  • Easily create a window for ModernGL using pyglet, pygame, PySide2, GLFW, SDL2, PyQt5 or tkinter supporting a wide range of window, keyboard and mouse events. These events are unified into a single system so your project can work with any window.
  • Load 2D textures and texture arrays
  • Load shaders as single or multiple glsl files
  • Load objects/scenes from wavefront/obj, GLTF 2.0 or STL
  • Resource finder system supporting multiple resource directories
  • A highly plugable library supporting custom loaders, resource finders and windows.
  • Type hints everywhere making code completion and linting a breeze

We are not trying to force the user into using every aspect of this library. If you have an exiting project and just need texture loading you will be able to do this without unnecessary hurdles as long as you provide us your moderngl.Context.


pip install moderngl-window

Supported Platforms

  • Windows
  • Linux
  • Mac OS X

Sample Usage

Simple example opening a window clearing every frame using red (color).

import moderngl_window as mglw

class Test(mglw.WindowConfig):
    gl_version = (3, 3)

    def render(self, time, frametime):
        self.ctx.clear(1.0, 0.0, 0.0, 0.0)


Run the example with different window backends:

python --window pyglet
python --window pygame
python --window glfw
python --window sdl2
python --window pyside2
python --window pyqt5
python --window tk

WindowConfig classes are the simplest way to get started without knowing a lot about this library. For more advanced usage see documentation or examples.

Setup from source

We assume the user knows how to handle vitrualenvs.

# Install the package in editable mode
$ pip install -e .

# Set up and dev requirements
pip install -r requirements.txt
pip install -r tests/requirements.txt

Running Tests

Tests are set up with tox running pytest with coverage and flake8.

pip install -r tests/requirements.txt
tox -e py35
tox -e py36
tox -e py37
tox -e py38
tox -e pep8

Building Docs

pip install -r docs/requirements.txt
python build_sphinx


Contributions are welcome regardless of experience level. Don't hesitate submitting issues, opening partial or completed pull requests.


We are interested in contributions providing new loaders, windows etc. For these to be included in this library we require them to work cross platforms (win10/linux/osx) and be fairly easy to set up.

If it requires more than manually downloading a pre-compiled dll (like SDL2, GLFW etc.) it would most likely not be included, but you are welcome to present your case if you still think it should be included.

If you create your own repo/package containing plugins for this library, please make an issue and we'll link back to it. Be sure to include what platforms are supported, install instructions, how you configure it in moderngl-window and of course a clear and concise description of what exactly your package provides.


We can't build everything from scratch. We rely on certain packages and resources to make this project possible.



Testing & Utility


Some History

The majority of the code in this library comes from demosys-py (somewhat modified). Because demosys-py is a framework we decided to split out a lot useful functionality into this library. Frameworks are a lot less appealing to users and it would be a shame to not make this more available to the ModernGL user base.

You can’t perform that action at this time.