python - Pycairo:如何正确实例 cairo.XlibSurface()?

标签 python cairo xlib pycairo

我正在尝试使用 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/

相关文章:

c++ - Xlib : Segmentation fault on multithreading

python - 如何创建一个频率为一小时(不包括周末)的 pandas.date_range ?

python - 将 timedelta 转换为年?

haskell - 在 Gtk2hs 中渲染 Cairo 更新的正确方法是什么?

c++ - Xlib XSendEvent 单击事件在 Ubuntu 12.04 的某些窗口中不起作用

python - 通过其他应用程序在 GtkDrawingArea 中绘图

Python包安装错误-找不到py_compiler msvc

python - 在 Python 中检测网络是否空闲

Python SVG 转换器创建空文件

开罗:绘制像素数组