PyOpenGL: в обратном вызове glutTimerFunc отсутствует обязательный параметр 'value' - PullRequest
0 голосов
/ 12 сентября 2018

Используя PyOpenGL, я пытаюсь создать простой треугольник, который меняет цвет при каждом вызове обновления, и я пытаюсь использовать glutTimerFunc (...) для этого.

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

import random

def display(value):
    v1 = [-.25,0]
    v2 = [0,.25]
    v3 = [.25, 0]
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)
    glClear(GL_COLOR_BUFFER_BIT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-1,1,-1,1,-1,1)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glBegin(GL_TRIANGLES)

    glColor3b(r,g,b)
    glVertex2f(v1[0], v1[1])
    glVertex2f(v2[0], v2[1])
    glVertex2f(v3[0], v3[1])

    glEnd()
    glFlush()

    glutTimerFunc(1000, display, 5)
    glutPostRedisplay()

if __name__ == '__main__':
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500,500)
    glutCreateWindow("First Shape")
    glutDisplayFunc(display)
    glutMainLoop()

Это ошибка, которую я получаю ...

Traceback (most recent call last):
File "_ctypes/callbacks.c", line 232, in 'calling callback function'
TypeError: display() missing 1 required positional argument: 'value'

Я попытался передать значение и поместить его в список параметров для display () безуспешно.

1 Ответ

0 голосов
/ 12 сентября 2018

Функция обратного вызова, требуемая для glutDisplayFunc, не имеет параметра, но функция обратного вызова, требуемая для glutTimerFunc, имеет параметр. Таким образом, вы не можете использовать одну и ту же функцию для обоих.
Возможно что-то вроде следующего:

def timer(value):
    display()

def display()

    glutTimerFunc(1000, timer, 5)

Но это не решит твою проблему, потому что glutPostRedisplay помечает текущее окно как подлежащее повторному отображению и вызывает, что вызывается функция обратного вызова дисплея, которая установлена ​​в glutDisplayFunc.

Если вы хотите изменить цвет по времени, создайте функцию таймера, которая устанавливает новый цвет и перезапускает таймер:

r = 255
g = 255
b = 255

def timer(value):
    global r, b, g
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)
    glutTimerFunc(1000, timer, 5)

Удалите инициализацию таймера из функции display

def display():
    global r, b, g
    v1 = [-.25,0]
    v2 = [0,.25]
    v3 = [.25, 0]
    glClear(GL_COLOR_BUFFER_BIT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-1,1,-1,1,-1,1)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glBegin(GL_TRIANGLES)

    glColor3b(r,g,b)
    glVertex2f(v1[0], v1[1])
    glVertex2f(v2[0], v2[1])
    glVertex2f(v3[0], v3[1])

    glEnd()
    glFlush()

    glutPostRedisplay()

Но вызовите функцию timer один раз при запуске:

if __name__ == '__main__':
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500,500)
    glutCreateWindow("First Shape")
    glutDisplayFunc(display)
    timer(0);
    glutMainLoop()
...