Python をhttps://github.com/tdz/gtkglextの gtk3 および GTKGLExt フォークと組み合わせて使用するので、gobject イントロスペクション機能を使用して Python から Gtk3 を使用できます。OpenGL のものを描画するために Gtk.DrawingArea を作成しました。このウィジェットのインスタンスが 1 つしかない限り、すべてが正常に機能します。
ただし、Gtk Notebook を使用して、このウィジェットの複数のインスタンスをノートブックの異なるページに表示します (ページごとに 1 つのウィジェット)。
ときどき (非決定論的な方法で) プログラムがセグメンテーション違反でクラッシュすることがあります。私は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 プログラマーではないので、誰かがこの問題に対処する方法を教えてくれたら、とてもうれしいです。