Python Pycairo:如何正确地实例化cairo.XlibSurface()?
我试图用Pycairo创建小部件来监视系统,比如Conky。 我试图直接在X上绘制,使用带Xlib的Cairo曲面 当我尝试实例化cairo.XlibSurface()类时,返回一个错误:Python Pycairo:如何正确地实例化cairo.XlibSurface()?,python,cairo,xlib,pycairo,Python,Cairo,Xlib,Pycairo,我试图用Pycairo创建小部件来监视系统,比如Conky。 我试图直接在X上绘制,使用带Xlib的Cairo曲面 当我尝试实例化cairo.XlibSurface()类时,返回一个错误: TypeError: The XlibSurface type cannot be directly instantiated 我的简单代码: import cairo surface = cairo.XlibSurface() 如何正确地引用cairo.XlibSurface() 提前感谢[不是完整的答
TypeError: The XlibSurface type cannot be directly instantiated
我的简单代码:
import cairo
surface = cairo.XlibSurface()
如何正确地引用cairo.XlibSurface()
提前感谢[不是完整的答案]
我有足够的片段,这可能是更有用的回答,而不是作为一个评论。很抱歉,我没有弄清这件事的真相
它本身只提到它可以通过对GTK的某些调用进行实例化——我不确定这是否只是对GTK2的旧绑定。我可以找到一个片段来使用GTK+3获得Cairo上下文,但是如果不使用ctypes,从Cairo上下文返回到它使用的表面似乎是不可行的
因此,您基本上需要使用Python ctypes调用,并找到一种使用ctypes从上述函数返回的指针创建Python cairo.XlibSurface实例的方法。这就是您可能必须在pygtk遗留代码库中用C找到的“缺少的链接”,并在Python代码中用ctypes进行复制
首先,对于cairo\u xlib\u surface\u create
调用所需的参数,您可能可以使用-下面的代码片段为您提供一个窗口GID和用于X显示和窗口的Python包装:
从Xlib导入X,显示
pd=display.display()
win=pd.screen().root.create_窗口(0,0,640,480,0,pd.screen().root_深度,X.InputOutput,X.CopyFromParent)
win.map()
pd.sync()
xid=xx.\uuuuu资源
[不是完整的答案]
我有足够的片段,这可能是更有用的回答,而不是作为一个评论。很抱歉,我没有弄清这件事的真相
它本身只提到它可以通过对GTK的某些调用进行实例化——我不确定这是否只是对GTK2的旧绑定。我可以找到一个片段来使用GTK+3获得Cairo上下文,但是如果不使用ctypes,从Cairo上下文返回到它使用的表面似乎是不可行的
因此,您基本上需要使用Python ctypes调用,并找到一种使用ctypes从上述函数返回的指针创建Python cairo.XlibSurface实例的方法。这就是您可能必须在pygtk遗留代码库中用C找到的“缺少的链接”,并在Python代码中用ctypes进行复制
首先,对于cairo\u xlib\u surface\u create
调用所需的参数,您可能可以使用-下面的代码片段为您提供一个窗口GID和用于X显示和窗口的Python包装:
从Xlib导入X,显示
pd=display.display()
win=pd.screen().root.create_窗口(0,0,640,480,0,pd.screen().root_深度,X.InputOutput,X.CopyFromParent)
win.map()
pd.sync()
xid=xx.\uuuuu资源
没有解决这个问题:如何将Pycairo与Xlib结合使用,而是一个使用Gtk和Pycairo的优雅替代方案
如何将Pycairo与Xlib结合使用的奥秘还在继续
将Gtk窗口与Gdk.WindowTypeHint.DESKTOP
一起使用,获得优雅的输出
导入gi
gi.require\u版本({
“Gdk”:“3.0”,
“Gtk”:“3.0”,
“Wnck”:“3.0”,
“商品及服务税”:“1.0”,
“AppIndicator3”:“0.1”,
})
从gi.repository导入Gtk、Gdk
进口开罗
类示例(Gtk.Window):
定义初始化(自):
super(例如,self)。\uuuuu init\uuuuuuuu()
self.tran_setup()
self.init_ui()
def初始用户界面(自身):
自连接(“绘制”,自绘制)
#self.set_标题(“透明窗口”)
自我调整大小(300250)
自我设置位置(Gtk.WindowPosition.NONE)
自我移动(0,40)
self.connect(“删除事件”,Gtk.main_退出)
#魔法就在这里
self.set\u type\u提示(Gdk.WindowTypeHint.DESKTOP)
self.show_all()
def传输设置(自):
自设置应用程序可绘制(真)
screen=self.get_screen()
#打印(self.get\u type\u hint())
visual=screen.get_rgba_visual()
如果是可视的!=无和屏幕。是否已合成()
自设置_视觉(视觉)
图纸上的def(自身、wid、cr):
cr.set_源_rgba(0.2,0.2,0.2,0.4)
cr.set_运算符(cairo.operator_源)
cr.油漆()
cr.set_源_rgb(0.6,0.6,0.6)
cr矩形(20,20,120,80)
cr.fill()
自绘制(cr)
def抽取(自,cr):
cr.set_源_rgb(0、256、256)
cr矩形(180,20,80,80)
cr.fill()
def main():
app=示例()
Gtk.main()
如果名称=“\uuuuu main\uuuuuuuu”:
main()
输出:
没有解决这个问题:如何将Pycairo与Xlib结合使用,而是一个使用Gtk和Pycairo的优雅替代方案
如何将Pycairo与Xlib结合使用的奥秘还在继续
将Gtk窗口与Gdk.WindowTypeHint.DESKTOP
一起使用,获得优雅的输出
导入gi
gi.require\u版本({
“Gdk”:“3.0”,
“Gtk”:“3.0”,
“Wnck”:“3.0”,
“商品及服务税”:“1.0”,
“AppIndicator3”:“0.1”,
})
从gi.repository导入Gtk、Gdk
进口开罗
类示例(Gtk.Window):
定义初始化(自):
super(例如,self)。\uuuuu init\uuuuuuuu()
self.tran_setup()
self.init_ui()
def初始用户界面(自身):
自连接(“绘制”,自绘制)
#self.set_标题(“透明窗口”)
自我调整大小(300250)
自我设置位置(Gtk.WindowPosition.NONE)
自我移动(0,40)
self.connect(“删除事件”,Gtk.main_退出)
#魔法就在这里
self.set\u type\u提示(Gdk.WindowTypeHint.DESKTOP)
self.show_all()
def传输设置(自):
自设置应用程序可绘制(真)
screen=self.get_screen()
#打印(self.get\u type\u hint())
visual=screen.get_rgba_visual()
如果是可视的!=无和屏幕。是否已合成()
自设置_视觉(视觉)
图纸上的def(自身、wid、cr):