Sie können Python-Xlib-Typen nicht direkt mit Python-Opengl verwenden. Aber Sie können die Tatsache verwenden, dass ein Fenster XID nur eine Nummer ist, um Python-Opengl im selben Fenster zu verwenden.
from Xlib import X, display
from OpenGL import GL, GLX
from OpenGL.raw._GLX import struct__XDisplay
from ctypes import *
# some python-xlib code...
pd = display.Display()
pw = pd.screen().root.create_window(50, 50, 200, 200, 0,
pd.screen().root_depth,
X.InputOutput, X.CopyFromParent)
pw.map()
# ensure that the XID is valid on the server
pd.sync()
# get the window XID
xid = pw.__resource__()
# a separate ctypes Display object for OpenGL.GLX
xlib = cdll.LoadLibrary('libX11.so')
xlib.XOpenDisplay.argtypes = [c_char_p]
xlib.XOpenDisplay.restype = POINTER(struct__XDisplay)
d = xlib.XOpenDisplay("")
# use GLX to create an OpenGL context on the same window XID
elements = c_int()
configs = GLX.glXChooseFBConfig(d, 0, None, byref(elements))
w = GLX.glXCreateWindow(d, configs[0], c_ulong(xid), None)
context = GLX.glXCreateNewContext(d, configs[0], GLX.GLX_RGBA_TYPE, None, True)
GLX.glXMakeContextCurrent(d, w, w, context)
# some python-opengl code....
GL.glShadeModel(GL.GL_FLAT)
GL.glClearColor(0.5, 0.5, 0.5, 1.0)
GL.glViewport(0, 0, 200, 200)
GL.glMatrixMode(GL.GL_PROJECTION)
GL.glLoadIdentity()
GL.glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)
GL.glClear(GL.GL_COLOR_BUFFER_BIT)
GL.glColor3f(1.0, 1.0, 0.0)
GL.glRectf(-0.8, -0.8, 0.8, 0.8)
# assume we got a double buffered fbConfig and show what we drew
GLX.glXSwapBuffers(d, w)
# a terrible end to a terrible piece of code...
raw_input()
Das ist wirklich schrecklich, obwohl. (Fehler bei der Überprüfung und Auswahl einer sinnvollen fbConfig zur besseren Übersicht weggelassen)
Es sollte wirklich möglich sein, alle notwendigen xlib-Aufrufe mit Ctypes durchzuführen. Pyglet, zum Beispiel, schafft es irgendwie, aber ich bin mir nicht sicher, auf welches spezifische Problem Sie stoßen.
Sie haben vielleicht einen ganz guten Grund, Low-Level-Bibliotheken wie Xlib zu verwenden, aber ich muss fragen: Haben Sie darüber nachgedacht, etwas viel höheres zu verwenden, wie [QtOpenGL] (http://srinikom.github.com/pyside -docs/PySide/QtOpenGL/index.html) von PySide? Der Code, den Sie mit PySide schreiben, funktioniert auch auf mehreren Plattformen (Windows, Linux, Mac) im Gegensatz zu dem, den Sie mit Xlib schreiben. Nur ein Gedanke. – crayzeewulf
Nein, PyOpenGL hat keine eigene xlib-Implementierung. Nichts auf der Python-Seite hat tatsächlich. Python-xlib wurde zuletzt im Jahr 2009 veröffentlicht, also ist es effektiv tot. Verwenden Sie GLUT oder eines der Toolkits auf höherer Ebene. –
@crayzeewulf: Yup, ich habe einen guten Grund. Ich mache einen X-Windows-Hack, bei dem interaktive OpenGL-Hintergrundbilder auf den Desktop gezeichnet werden. Es beinhaltet EMWH Hinweise und ein paar andere unordentliche Bits, also bezweifle ich, dass Qt oder was auch immer das tun könnte. –