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