Вы пропустили оператор global
в key_callback
:
def key_callback(window, key, scancode, action, mods):
global currentMode # <--- THIS IS MISSING
if key==glfw.KEY_1:
if action==glfw.PRESS:
currentMode = GL_POINTS
# [...]
Переменная currentMode
существует дважды. Это переменная в глобальном пространстве имен и локальная переменная в области действия функции key_callback
. Используйте оператор global
для интерпретации currentMode
как глобальной и для записи в глобальную переменную currentMode
с помощью key_callback
.
Конечно, то же самое относится и к функции main
:
def main():
global currentMode
# [...]
Кроме того, вы должны очистить буфер кадров в render
:
def render(currentMode):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
См. Пример:
import glfw
from OpenGL.GL import *
import numpy as np
def render(currentMode):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
print(currentMode)
glBegin(currentMode)
#Draw Something
glVertex2f(-0.5, -0.5)
glVertex2f(0.5, 0.5)
glVertex2f(-0.5, 0.5)
glEnd()
def key_callback(window, key, scancode, action, mods):
global currentMode
if key==glfw.KEY_1:
if action==glfw.PRESS:
currentMode = GL_POINTS
elif key==glfw.KEY_2:
if action==glfw.PRESS:
currentMode = GL_LINES
elif key==glfw.KEY_3:
if action==glfw.PRESS:
currentMode = GL_LINE_STRIP
def main():
global currentMode
if not glfw.init():
return
window = glfw.create_window(480, 480, "Test ", None, None)
if not window:
glfw.terminate()
return
glfw.make_context_current(window)
glfw.set_key_callback(window, key_callback)
glfw.swap_interval(1)
while not glfw.window_should_close(window):
glfw.poll_events()
render(currentMode)
glfw.swap_buffers(window)
glfw.terminate()
if __name__ == "__main__":
currentMode = GL_LINE_LOOP
main()