Aug-12-2019, 07:33 AM
I copied a sample code from stackoverflow, which draws a red triangle using Python, Gtk3, Shaders and OpenGL and it works perfectly fine.
When I try to add a textview next to it, the textview is not visible as soon as the GLArea is included.
When I try to add a textview next to it, the textview is not visible as soon as the GLArea is included.
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from OpenGL.GL import * from OpenGL.GL import shaders import numpy as np FRAGMENT_SOURCE =''' #version 330 in vec4 inputColor; out vec4 outputColor; void main(){ outputColor = vec4(1.0,0.0,0.0,1.0);//constant red. I know it's a poor shader };''' VERTEX_SOURCE = ''' #version 330 in vec4 position; void main(){ gl_Position = position; }''' class MyGLArea(Gtk.GLArea): def __init__(self): Gtk.GLArea.__init__(self) self.connect("realize", self.on_realize) self.connect("render", self.on_render) def on_realize(self, area): ctx = self.get_context() print("realized", ctx) def on_render(self, area, ctx): ctx.make_current() glClearColor(0, 0, 0, 1) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) VERTEX_SHADER_PROG = shaders.compileShader(VERTEX_SOURCE, GL_VERTEX_SHADER) FRAGMENT_SHADER_PROG = shaders.compileShader(FRAGMENT_SOURCE, GL_FRAGMENT_SHADER) self.shader_prog = shaders.compileProgram(VERTEX_SHADER_PROG, FRAGMENT_SHADER_PROG) self.create_object() def create_object(self): # Create a new VAO (Vertex Array Object) and bind it vertex_array_object = glGenVertexArrays(1) glBindVertexArray(vertex_array_object) # Generate buffers to hold our vertices vertex_buffer = glGenBuffers(1) glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer) # Get the position of the 'position' in parameter of our shader and bind it. position = glGetAttribLocation(self.shader_prog, 'position') glEnableVertexAttribArray(position) # Describe the position data layout in the buffer glVertexAttribPointer(position, 3, GL_FLOAT, False, 0, ctypes.c_void_p(0)) # Send the data over to the buffer vertices = np.array([-0.6, -0.6, 0.0, 0.0, 0.6, 0.0, 0.6, -0.6, 0.0, 0.7, -0.1, 0.0, 0.8, 0.1, 0.0, 0.9, -0.1, 0.0 ], dtype=np.float32) glBufferData(GL_ARRAY_BUFFER, 96, vertices, GL_STATIC_DRAW) # Unbind the VAO first (Important) glBindVertexArray(0) # Unbind other stuff glDisableVertexAttribArray(position) glBindBuffer(GL_ARRAY_BUFFER, 0) self.display(vertex_array_object) def display(self, vert): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glUseProgram(self.shader_prog) glBindVertexArray(vert) glDrawArrays(GL_TRIANGLES, 0, 3) glBindVertexArray(0) glUseProgram(0) class RootWidget(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title='GL Example') self.set_default_size(700, 500) gl_area = MyGLArea() tv = Gtk.TextView() self.set_default_size(100, 500) hbox = Gtk.HPaned() self.set_default_size(800, 500) hbox.add(tv) hbox.add(gl_area) # Watch here: Textview is not visible anymore when glarea is added self.add(hbox) win = RootWidget() win.connect("delete-event", Gtk.main_quit) win.show_all() Gtk.main()