【问题标题】:How do I use the xlib and OpenGL modules together with python?如何将 xlib 和 OpenGL 模块与 python 一起使用?
【发布时间】:2013-02-02 17:21:26
【问题描述】:

我知道可以将 Xlib 和 OpenGL 与 GLX 一起使用(我自己用 C 语言完成了)。

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

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

我是否遗漏了一些明显的东西,比如 PyOpenGL 有自己的 xlib 实现,或者如果没有一些(编译的)模块编写,这是不可能的?

【问题讨论】:

  • 您可能有充分的理由使用 Xlib 等低级库,但我不得不问:您是否考虑过使用更高级别的库,例如 PySide 的 QtOpenGL?与使用 Xlib 编写的代码不同,您使用 PySide 编写的代码也可以在多个平台(Windows、Linux、Mac)上运行。只是一个想法。
  • 不,PyOpenGL 没有自己的 xlib 实现。 Python 方面实际上没有任何东西。 Python-xlib 最后一次发布是在 2009 年左右,所以它实际上已经死了。使用 GLUT 或更高级别的工具包之一。
  • @crayzeewulf:是的,我有充分的理由。我正在做一个涉及将交互式 OpenGL 壁纸绘制到桌面的 X-windows hack。它涉及设置 EMWH 提示和其他一些混乱的部分,所以我怀疑 Qt 或其他任何东西可以做到这一点。
  • @n.m.:好的。看起来 Boost::Python 可能是我的朋友。如果我最终这样做,我会回帖。
  • 迈克尔,感谢您的解释。祝你好运。我以前使用ctypes 访问类似的低级库,但必须手动将预处理器宏转换为等效的 Python 函数。有时别无选择。

标签: python opengl x11 xlib


【解决方案1】:

您不能直接将 python-xlib 类型与 python-opengl 一起使用。但是你可以利用窗口 XID 只是一个数字的事实在同一个窗口上使用 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 以某种方式进行管理,但我不确定您遇到了什么具体问题。

【讨论】:

  • “这真是太可怕了” - 同意,不过我会奖励这个,因为这正是我所要求的。 :) 我实际上最终做的是制作一些普通的 C++ 实用程序并将其包装在 Boost::Python 中,因此我只公开必要的位。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2021-12-26
相关资源
最近更新 更多