Функция обратного вызова, требуемая для 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()