如何将xlib和OpenGL模块与python一起使用?

2024-09-27 19:11:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我可以和OpenXLC一起使用。在

问题是,如何在python中实现这一点?OpenGL模块有GLX功能[documentation],但它似乎在使用C类型,我不知道(其他人也不知道)如何在PyOpenGL中使用xlib types。在

我也尝试过使用ctypes并直接加载库,但是在尝试使用Xlib头文件中定义的C宏时遇到了(明显的)问题,比如DefaultRootWindow。在

我是否遗漏了一些显而易见的东西,比如PyOpenGL有它自己的xlib实现,还是没有一些(编译的)模块编写就不可能实现?在


Tags: 模块功能类型定义头文件documentationctypesopengl
1条回答
网友
1楼 · 发布于 2024-09-27 19:11:21

不能在python opengl中直接使用pythonxlib类型。但您可以使用这样一个事实,即windowxid只是一个数字,以便在同一个窗口上使用python opengl。在

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调用。比如说,Pyglet可以应付,但我不知道你遇到了什么具体问题。在

相关问题 更多 >

    热门问题