Pycairo:如何正确地实例化cairo.XlibSurface()?

2024-06-26 00:20:24 发布

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

我试图用Pycairo创建小部件来监视系统,比如Conky。 我试图直接在X上绘制,使用带Xlib的Cairo曲面

当我尝试实例化cairo.XlibSurface()类时,返回一个错误:

TypeError: The XlibSurface type cannot be directly instantiated

我的简单代码:

import cairo
surface = cairo.XlibSurface()

如何正确地引用cairo.XlibSurface()

提前谢谢


Tags: the实例部件错误绘制cairo曲面监视系统
2条回答

没有解决这个问题:如何将Pycairo与Xlib结合使用,而是使用Gtk和Pycairo的一个优雅的替代方案

如何将Pycairo与Xlib结合使用的奥秘还在继续

使用带有Gdk.WindowTypeHint.DESKTOP的Gtk窗口,获得优雅的输出

import gi
gi.require_versions({
    'Gdk':  '3.0',
    'Gtk':  '3.0',
    'Wnck': '3.0',
    'Gst':  '1.0',
    'AppIndicator3': '0.1',
})

from gi.repository import Gtk, Gdk
import cairo


class Example(Gtk.Window):

    def __init__(self):
        super(Example, self).__init__()

        self.tran_setup()
        self.init_ui()

    def init_ui(self):
        self.connect("draw", self.on_draw)
        # self.set_title("Transparent window")
        self.resize(300, 250)
        self.set_position(Gtk.WindowPosition.NONE)
        self.move(0, 40)
        self.connect("delete-event", Gtk.main_quit)
        
        # The magic is here
        self.set_type_hint(Gdk.WindowTypeHint.DESKTOP)

        self.show_all()

    def tran_setup(self):
        self.set_app_paintable(True)
        screen = self.get_screen()

        #print(self.get_type_hint())

        visual = screen.get_rgba_visual()
        if visual != None and screen.is_composited():
            self.set_visual(visual)

    def on_draw(self, wid, cr):
        cr.set_source_rgba(0.2, 0.2, 0.2, 0.4)
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.paint()

        cr.set_source_rgb(0.6, 0.6, 0.6)

        cr.rectangle(20, 20, 120, 80)
        cr.fill()

        self.draw(cr)

    def draw(self, cr):
        cr.set_source_rgb(0, 256, 256)
        cr.rectangle(180, 20, 80, 80)
        cr.fill()


def main():
    app = Example()
    Gtk.main()


if __name__ == "__main__":
    main()

输出:

Print

[不是完整的答案] 我有足够的片段,这可能是更有用的回答,而不是作为一个评论。很抱歉,我没有弄清这件事的真相

{a1}本身只提到它可以通过对GTK的某些调用进行实例化——我不确定这是否只是对GTK2的旧绑定。我可以找到一个片段来使用GTK+3获得Cairo上下文,但是如果不使用ctypes,从Cairo上下文返回到它使用的表面似乎是不可行的

因此,您基本上需要使用Python ctypes调用Cairo's C ^{},并找到一种方法,使用ctypes从上述函数返回的指针创建Python cairo.XlibSurface实例。这就是您可能必须在pygtk遗留代码库中用C找到的“缺少的链接”,并在Python代码中用ctypes进行复制

至于第一个cairo_xlib_surface_create调用所需的参数,您可能可以使用Python XLib获取它们-下面的代码片段为您提供了一个窗口GID和用于X显示和窗口的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__()

相关问题 更多 >