2013-02-18 32 views
9

Tôi biết có thể sử dụng Xlib và OpenGL cùng với GLX (tôi đã tự mình thực hiện trong C).Làm cách nào để sử dụng các mô-đun xlib và OpenGL cùng với python?

Vấn đề là, làm thế nào để làm điều này trong python? Mô-đun OpenGL có chức năng GLX [documentation] nhưng có vẻ như đang sử dụng các loại C và tôi không có ý tưởng (cũng không xuất hiện cho bất kỳ ai khác) cách sử dụng xlib types với PyOpenGL.

Tôi cũng đã thử sử dụng ctypes và tải thư viện trực tiếp nhưng gặp sự cố (hiển nhiên) khi cố gắng sử dụng macro C được xác định trong tệp tiêu đề Xlib, như DefaultRootWindow.

Tôi có thiếu điều gì đó hiển nhiên, như PyOpenGL có thực hiện xlib riêng của mình hay không, không có mô-đun nào được soạn thảo?

+0

Bạn có thể có lý do hoàn toàn phù hợp để sử dụng các thư viện cấp thấp như Xlib nhưng tôi phải hỏi: bạn đã cân nhắc sử dụng mức cao hơn nhiều như [QtOpenGL] (http://srinikom.github.com/pyside) -docs/PySide/QtOpenGL/index.html) từ PySide? Mã bạn viết bằng PySide cũng sẽ hoạt động trên nhiều nền tảng (Windows, Linux, Mac) trái ngược với mã bạn viết bằng Xlib. Chỉ là một ý nghĩ. – crayzeewulf

+0

Không, PyOpenGL không có triển khai xlib riêng. Không có gì ở phía Python thực sự có. Python-xlib được phát hành lần cuối vào khoảng năm 2009 vì vậy nó đã chết một cách hiệu quả. Sử dụng GLUT hoặc một trong các bộ công cụ cấp cao hơn. –

+1

@crayzeewulf: Yup, tôi có lý do chính đáng. Tôi đang làm một cửa sổ X-hack liên quan đến việc vẽ hình nền OpenGL tương tác với máy tính để bàn. Nó liên quan đến việc thiết lập các gợi ý EMWH và một vài bit lộn xộn khác, vì vậy tôi nghi ngờ rằng Qt hoặc bất cứ điều gì có thể làm điều đó. –

Trả lời

2

Bạn không thể sử dụng các loại python-xlib trực tiếp với python-opengl. Nhưng bạn có thể sử dụng thực tế là một cửa sổ XID chỉ là một số để sử dụng python-opengl trên cùng một cửa sổ.

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

Điều này thực sự rất kinh khủng. (Lỗi khi kiểm tra và chọn một fbConfig hợp lý bị bỏ qua để rõ ràng)

Thực sự có thể thực hiện tất cả các cuộc gọi xlib cần thiết với ctypes. Pyglet, ví dụ, quản lý bằng cách nào đó, nhưng tôi không chắc chắn vấn đề cụ thể mà bạn gặp phải.

+0

"Điều này thực sự khủng khiếp" - Đồng ý, mặc dù tôi sẽ thưởng cho điều này vì đây chính xác là những gì tôi yêu cầu. :) Những gì tôi thực sự đã kết thúc làm là làm cho một số tiện ích C++ bình thường và gói nó trong Boost :: Python vì vậy tôi chỉ phơi bày các bit cần thiết. Chúc mừng! –

Các vấn đề liên quan