I'm building a game engine using Pygame and modernGL. When I run the program it's supposed to render a red triangle. However, it only renders the red triangle when the program is closed.

Here are my file codes:
main.py
import pygame
import moderngl as mgl
import sys
from model import Model
class GameEngine:
def __init__(self, screenSize=(800, 600)):
pygame.init()
pygame.display.gl_set_attribute(pygame.GL_CONTEXT_MAJOR_VERSION, 3)
pygame.display.gl_set_attribute(pygame.GL_CONTEXT_MINOR_VERSION, 3)
pygame.display.gl_set_attribute(pygame.GL_CONTEXT_PROFILE_MASK, pygame.GL_CONTEXT_PROFILE_CORE)
pygame.display.set_mode(screenSize, flags=pygame.GL_DOUBLEBUFFER | pygame.OPENGL)
self.context = mgl.create_context()
self.clock = pygame.time.Clock()
self.scene = Model(self)
self.running = True
def check_events(self):
pass
def render(self):
self.context.clear(color=(0.00, 0.16, 0.18))
self.scene.render()
def run(self):
while self.running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
self.render()
pygame.display.flip()
print('FRAME rendered')
self.clock.tick(60)
self.scene.destroy()
pygame.quit()
sys.exit()
if __name__ == '__main__':
app = GameEngine()
app.run()
model.py
import numpy as np
class Model:
def __init__(self, app):
self.app = app
self.context = app.context
self.vbo = self.get_vbo()
self.shader_program = self.get_shader_program('default')
self.vao = self.get_vao()
def render(self):
self.vao.render()
print('VAO rendered')
def destroy(self):
self.vbo.release()
self.shader_program.release()
self.vao.release()
def get_vao(self):
vao = self.context.vertex_array(self.shader_program, [(self.vbo, '3f', 'ini_position')])
return vao
def get_vertex_data(self):
vertex_data = [(1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(-1.0, 0.0, 0.0), (0.0, -1.0, 0.0)]
vertex_data = np.array(vertex_data, dtype='f4')
return vertex_data
def get_vbo(self):
vertex_data = self.get_vertex_data()
vbo = self.context.buffer(vertex_data)
return vbo
def get_shader_program(self, shader_name):
with open(f'C:/Users/gabri/Documents/Projeto_Testes/gameEngine/shaders/{shader_name}.vert') as file:
vert_shader = file.read()
with open(f'C:/Users/gabri/Documents/Projeto_Testes/gameEngine/shaders/{shader_name}.frag') as file:
frag_shader = file.read()
program = self.context.program(vertex_shader=vert_shader, fragment_shader=frag_shader)
return program
render.py
from model import Model
import pygame
class Render(Model):
def __init__(self, app):
super().__init__(app)
self.vbo = self.get_vbo()
self.vao = self.get_vao()
def render(self):
self.vao.render()
print('VAO rendered')
def destroy(self):
self.vbo.release()
self.shader_program.release()
self.vao.release()
default.frag
#version 330
layout (location = 0) out vec4 fragColor;
void main() {
vec3 color = vec3(1.0, 0.0, 0.0);
fragColor = vec4(color, 1.0);
}
defaul.vert
#version 330
layout(location = 0) in vec3 ini_position;
void main() {
gl_Position = vec4(ini_position, 1.0);
}
I tried to use the pygame.display.flip() on different places of the code but I had the same problem