2013-02-18 13 views
9

Ich weiß, dass es möglich ist, Xlib und OpenGL zusammen mit GLX zu verwenden (ich habe es selbst in C gemacht).Wie verwende ich die xlib und OpenGL Module zusammen mit Python?

Das Problem ist, wie mache ich das in Python? Das OpenGL Modul hat GLX-Funktionalität [documentation], aber es scheint C-Typen zu verwenden, und ich habe keine Ahnung (noch scheint es jemand anderes), wie Sie die xlib types mit PyOpenGL verwenden.

Ich versuchte auch mit ctypes und Laden von Bibliotheken direkt, aber rannte in (offensichtliche) Probleme beim Versuch, die C-Makros in der Xlib-Header-Datei definiert, wie DefaultRootWindow.

Fehle ich etwas Offensichtliches, wie PyOpenGL seine eigene xlib Implementierung hat, oder ist das einfach nicht möglich ohne (kompiliertes) Modulschreiben?

+0

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

+0

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. –

+1

@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. –

Antwort

2

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.

+0

"Das ist wirklich schrecklich" - Einverstanden, aber ich werde das belohnen, da dies genau das ist, wonach ich gefragt habe. :) Was ich eigentlich gemacht habe, war, einige normale C++ - Utilities zu machen und sie in Boost :: Python zu verpacken, damit ich nur die notwendigen Bits enthülle. Prost! –