Python的简单设置+;开罗+;GTK/GDK像素缓冲区

Python的简单设置+;开罗+;GTK/GDK像素缓冲区,python,pygtk,pycairo,Python,Pygtk,Pycairo,为了我自己的利益和可能的教育用途,我想为Python和Cairo制作一个类似pygame的API。但我不希望这完全是一场恶作剧。相反,我想让它成为一个半静态的绘图平台,使用GTK/GDK显示一个或多个图像,并且我想模仿TiKZ(latex包)的优秀API原则。PyGameAPI不错,但我对它不满意。一个特别的问题是,我希望包通过将所有内容绘制到一个pixbuf(使用Cairo)中来处理窗口刷新,并在打开窗口时自动重新绘制pixbuf。这样,终端程序员就不必担心窗口刷新。事实上,最终程序员不必编写

为了我自己的利益和可能的教育用途,我想为Python和Cairo制作一个类似pygame的API。但我不希望这完全是一场恶作剧。相反,我想让它成为一个半静态的绘图平台,使用GTK/GDK显示一个或多个图像,并且我想模仿TiKZ(latex包)的优秀API原则。PyGameAPI不错,但我对它不满意。一个特别的问题是,我希望包通过将所有内容绘制到一个pixbuf(使用Cairo)中来处理窗口刷新,并在打开窗口时自动重新绘制pixbuf。这样,终端程序员就不必担心窗口刷新。事实上,最终程序员不必编写单个类或函数,也不必编写一系列直线代码来画笑脸。图形库也不必像TkInter中那样维护越来越长的存储形状对象列表。(至少,我希望开罗不会违背我的意图。)

我成功地在pycairo中绘制了各种各样的东西,并输出到ImageMagick和Postscript。所以我对pycairo本身没意见

不幸的是,我找到的cairo/gtk/pycairo/pygtk文档——我不知道它是为谁写的,但不是为我写的。目前,我是ProjectEuler类型的程序员,而不是“5个最前沿的超面向对象API”类型的程序员。我希望看到一个清晰的解释,和/或一个清晰的例子


好吧,我接受了发布的一个答案,因为它至少有一点帮助。但简而言之,这才是真正的重点。关键是,当您在GDK中绘制东西时,GDK会生成一个临时双缓冲区,包括使用Cairo。当您处理一个公开事件时,您只需重新绘制所有内容。但是如果您有一个非常复杂的图像,这是一个缓慢的过程,尤其是在Python中。因此,如果Cairo可以写入一个永久性的双缓冲区而不是临时缓冲区,那么使用GDK公开该永久性双缓冲区会更好。一些开发人员希望找到这个问题的解决方案。其中一个似乎有某种解决方案的项目是Google Chrome——你有没有注意到Google Chrome中的窗口曝光有多好,比如Linux?因此,我将查看Chromium的源代码,看看是否可以轻松地做到这一点

增编:我看到我确实混淆了这个问题,特别提到了“pixbufs”。我真的不在乎pixbufs(我又改了题名)。我真正关心的是在Cairo和GTK/GDK之间创建一个永久的双缓冲像素阵列,而不是临时的双缓冲像素阵列。似乎最简单的方法是将GTK窗口设置为Cairo曲面,并将双缓冲区设置为另一个Cairo曲面。由于我在问题中要求提供一个样本,以下是一些:

class Canvas(gtk.DrawingArea):
    def __init__(self):
        super(Canvas, self).__init__()
        self.connect("expose_event", self.expose)
        self.set_size_request(width,height)

    def expose(self, widget, event):
        cr = widget.window.cairo_create()
        cr.set_source_surface(mybuffer,0,0)
        cr.paint()
另一个很快出现的棘手问题是,我希望这是一个WYSISWYG绘图环境,可以立即绘制Python要求它绘制的内容,并且可以扩展到动画。然而,大多数GTK示例并不是这样设置的:事件处理被推迟,直到我调用
GTK.main()
。(或者在Python中,我惊讶地发现,
raw_input()
也会以某种方式刷新GTK事件队列。)通过Python示例,我找到了将事件控制权交给GTK的替代方案。最简单的解决方案,也可能是我将采用的解决方案,就是在需要时使用它来刷新事件缓冲区:

while gtk.events_pending(): gtk.main_iteration(False)

我还需要最后一件事,刷新像素缓冲区和事件缓冲区。这样做的一种方法是
window.queue\u draw()

,因为这对评论来说太大了,所以我添加了这个作为回应。
这个问题不太清楚。您的意思是问如何使用cairo绘图在Gtk小部件上绘图?首先,这里没有所谓的GTK Pixbuf,我想你指的是GDK Pixbuf。GTK中的大多数绘图工作都是在图层上完成的。如果您想了解有关窗口、绘图机制或图像处理的信息,您应该查看GDK以了解更多详细信息。希望能帮助您了解cairo gdk交互。虽然我在GTK、GDK和CAROO的python绑定方面的经验是零,但我认为如果您查找GDK CAROO示例,Google将为您提供一些很好的资源。

希望这至少有一点帮助

是的,对不起,我是说GTK/GDK。我修正了这个问题。至于“这些链接”,它们是用典型的开罗字形书写的。set_source_color()方法设置cairo上下文的源颜色。“源颜色”是什么?也许我能猜出答案,我不确定。在任何情况下,乍一看,它似乎并没有回答这个问题。它告诉我如何直接将Cairo绘制到GTK/GDK窗口中,而不是绘制到像素缓冲区中。您正在寻找Python+Cairo教程吗?有一个和另一个。对于PyGTK,有一个很好的Python API文档,对于cairo,您只需阅读C API文档并自己翻译成Python即可。maxy-谢谢。它并没有回答真正的问题,但这个例子告诉了我人们通常如何在Python中使用Cairo和GTK。