3

我将 Python 与https://github.com/tdz/gtkglext中的 gtk3 和 GTKGLExt fork 结合使用,因此我可以使用 gobject 内省功能从 python 中使用 Gtk3。我创建了一个 Gtk.DrawingArea 来绘制我的 OpenGL 内容。只要我只有这个小部件的一个实例,一切都可以正常工作。

但是,我使用 Gtk Notebook 让该小部件的多个实例出现在笔记本的不同页面中(每页一个小部件)。

有时(以不确定的方式表示)程序因分段错误而崩溃。我使用 gdb 运行了一个堆栈跟踪,并将问题定位为对“gtk_widget_end_gl”的调用,该调用位于我的绘图末尾,实现和配置处理程序方法(当然每个开头都有一个 gtk_widget_begin_gl) .

以下是堆栈跟踪的相关摘录:

0  0xb1170b58 in _gdk_x11_gl_context_impl_get_current () at gdkglcontext-x11.c:514
1  0xb116c094 in gdk_gl_context_get_current () at gdkglcontext.c:244
2  0xb116c0b4 in gdk_gl_context_release_current () at gdkglcontext.c:215
3  0xb4d04592 in gtk_widget_end_gl (widget=0xa175608, do_swap=0) at gtkglwidget.c:549

下面是我的实现方法的一个最小示例,其中“小部件”是 Gtk.DrawingArea 的一个实例时出现问题:

def on_realize(self, widget, *user_data):
    if not GtkGLExt.widget_begin_gl(widget):
        return False
    gl.glClearColor(BACKGROUND_COLOR[0],
                    BACKGROUND_COLOR[1],
                    BACKGROUND_COLOR[2],
                    BACKGROUND_COLOR[3])
    GtkGLExt.widget_end_gl(widget, False)  

由于我几乎不知道为什么有时会出现此问题(大约每 5 次创建一个新小部件),我想知道是否有人遇到过相同的问题或可以重现该问题或帮助我找到解决方案。

我需要说我没有在这里手动创建 OpenGL 上下文,因为在提供的示例中这似乎从来没有必要,我认为小部件会自行执行此操作。堆栈跟踪意味着获取上下文似乎存在问题。令我吃惊的是,这种情况有时只会发生。因此,如果有人甚至可以提示我如何解决这个问题,我会很高兴,因为我不是一个有经验的 C 程序员。

4

0 回答 0