我正在尝试使用 Pycairo 创建小部件来监控系统,例如 Conky。 我尝试使用 Cairo Surface 和 Xlib 直接在 X 上绘图。
当我尝试实例化 cairo.XlibSurface() 类时,返回错误:
TypeError: The XlibSurface type cannot be directly instantiated
我的简单代码:
import cairo
surface = cairo.XlibSurface()
如何正确实例 cairo.XlibSurface() ?
提前致谢
最佳答案
[不是完整的答案] 我有足够的片段,这可能作为答案比作为评论更有用。很抱歉没有深入了解这一点。
documentation for PyCairo XlibSurface它本身只提到它可以通过对 GTK 的某些调用来实例化 - 我不确定这是否只是对 GTK2 的旧绑定(bind)。我可以找到一个片段来使用 GTK +3 获取 Cairo 上下文,但如果不借助 ctypes,从 Cairo 上下文返回到它使用的 Surface 似乎是不可行的。
所以,您基本上需要调用Cairo's C cairo_xlib_surface_create
使用 Python ctypes,并找到一种使用 ctypes 从上面函数返回的指针创建 Python cairo.XlibSurface 实例的方法。这就是“缺失的链接”,您可能必须在 pygtk 遗留代码库中以 C 语言找到它,并在 Python 代码中使用 ctypes 进行复制。
至于cairo_xlib_surface_create
需要的参数首先调用,您可能可以使用 Python XLib 获取它们-下面的代码片段为您提供了 X Display 和 Window 的 Window GID 和 Python 包装器:
from Xlib import X, display
pd = display.Display()
win = pd.screen().root.create_window(0, 0, 640, 480, 0, pd.screen().root_depth, X.InputOutput, X.CopyFromParent)
win.map()
pd.sync()
xid = xx.__resource__()
关于python - Pycairo:如何正确实例 cairo.XlibSurface()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63606306/