2024-06-26 00:20:24 发布
网友
我试图用Pycairo创建小部件来监视系统,比如Conky。 我试图直接在X上绘制,使用带Xlib的Cairo曲面
当我尝试实例化cairo.XlibSurface()类时,返回一个错误:
TypeError: The XlibSurface type cannot be directly instantiated
我的简单代码:
import cairo surface = cairo.XlibSurface()
如何正确地引用cairo.XlibSurface()
提前谢谢
没有解决这个问题:如何将Pycairo与Xlib结合使用,而是使用Gtk和Pycairo的一个优雅的替代方案
如何将Pycairo与Xlib结合使用的奥秘还在继续
使用带有Gdk.WindowTypeHint.DESKTOP的Gtk窗口,获得优雅的输出
Gdk.WindowTypeHint.DESKTOP
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()
输出:
[不是完整的答案] 我有足够的片段,这可能是更有用的回答,而不是作为一个评论。很抱歉,我没有弄清这件事的真相
{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包装:
cairo_xlib_surface_create
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__()
没有解决这个问题:如何将Pycairo与Xlib结合使用,而是使用Gtk和Pycairo的一个优雅的替代方案
如何将Pycairo与Xlib结合使用的奥秘还在继续
使用带有
Gdk.WindowTypeHint.DESKTOP
的Gtk窗口,获得优雅的输出输出:
[不是完整的答案] 我有足够的片段,这可能是更有用的回答,而不是作为一个评论。很抱歉,我没有弄清这件事的真相
{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包装:相关问题 更多 >
编程相关推荐