2013-02-18 73 views
9

मुझे पता है कि एक्सएलआईबी और ओपनजीएल का उपयोग करना संभव है, जीएलएक्स के साथ (मैंने इसे स्वयं सी में किया है)।मैं पायथन के साथ xlib और OpenGL मॉड्यूल का उपयोग कैसे करूं?

समस्या यह है कि मैं इसे पायथन में कैसे कर सकता हूं? OpenGL मॉड्यूल में जीएलएक्स कार्यक्षमता है [documentation], लेकिन ऐसा लगता है कि सी प्रकारों का उपयोग किया जा रहा है और मुझे कोई विचार नहीं है (न ही, यह किसी और को दिखाई देता है) PyOpenGL के साथ xlib types का उपयोग कैसे करें।

मैंने ctypes का उपयोग करने और सीधे पुस्तकालयों को लोड करने का प्रयास किया, लेकिन Xlib शीर्षलेख फ़ाइल में परिभाषित सी मैक्रोज़ का उपयोग करने की कोशिश करते समय (स्पष्ट) समस्याओं में भाग लिया, जैसे DefaultRootWindow

क्या मुझे कुछ स्पष्ट याद आ रही है, जैसे PyOpenGL का अपना xlib कार्यान्वयन है, या यह कुछ (संकलित) मॉड्यूल-लेखन के बिना संभव नहीं है?

+0

आपके पास एक्सलिब जैसे निम्न-स्तरीय पुस्तकालयों का उपयोग करने का एक अच्छा कारण हो सकता है लेकिन मुझे यह पूछना है: क्या आपने [QtOpenGL] जैसे कुछ उच्च स्तर का उपयोग करने पर विचार किया है (http://srinikom.github.com/pyside -डॉक्स/पायसाइड/QtOpenGL/index.html) PySide से? आपके द्वारा पाइसाइड का उपयोग करके लिखने वाला कोड Xlib का उपयोग करके लिखने वाले एक के विपरीत कई प्लेटफॉर्म (विंडोज, लिनक्स, मैक) पर भी काम करेगा। सिर्फ एक विचार। – crayzeewulf

+0

नहीं, PyOpenGL का अपना xlib कार्यान्वयन नहीं है। वास्तव में पाइथन पक्ष पर कुछ भी नहीं है। पाइथन-एक्सलिब को आखिरकार 200 9 में रिलीज़ किया गया था, इसलिए यह प्रभावी रूप से मर चुका है। जीएलयूटी या उच्च स्तरीय टूलकिट्स में से एक का प्रयोग करें। –

+1

@ क्रेजवेउल्फ: हाँ, मेरे पास एक अच्छा कारण है। मैं एक एक्स-विंडोज हैक कर रहा हूं जिसमें डेस्कटॉप पर इंटरैक्टिव ओपनजीएल वॉलपेपर ड्राइंग शामिल है। इसमें ईएमडब्लूएच संकेत और कुछ अन्य गन्दा बिट्स सेट करना शामिल है, इसलिए मुझे संदेह है कि क्यूटी या जो कुछ भी कर सकता है। –

उत्तर

2

आप पाइथन-ओपनग्लॉग के साथ सीधे पाइथन-एक्सलिब प्रकारों का उपयोग नहीं कर सकते हैं। लेकिन आप इस तथ्य का उपयोग कर सकते हैं कि एक विंडो XID एक ही विंडो पर पायथन-ओपनगल का उपयोग करने के लिए सिर्फ एक संख्या है।

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() 

हालांकि यह वास्तव में भयानक है। (स्पष्टता के लिए छोड़े गए एक समझदार fbConfig को जांचने और चुनने में त्रुटि)

हालांकि वास्तव में ctypes के साथ सभी आवश्यक xlib कॉल करना संभव होना चाहिए। उदाहरण के लिए, पेजलेट, किसी भी तरह से प्रबंधित करता है, लेकिन मुझे यकीन नहीं है कि आप किस विशिष्ट समस्या में भाग गए हैं।

+0

"यह वास्तव में भयानक है" - सहमत है, हालांकि मैं इसे इनाम दूंगा क्योंकि यह वही है जो मैंने पूछा था। :) मैं वास्तव में क्या कर रहा था कुछ सामान्य सी ++ उपयोगिताओं को बना रहा था और इसे बूस्ट :: पायथन में लपेट रहा था इसलिए मैं केवल आवश्यक बिट्स का पर्दाफाश करता हूं। चीयर्स! –