【问题标题】:A simple setup for Python + Cairo + GTK/GDK pixel bufferPython + Cairo + GTK/GDK 像素缓冲区的简单设置
【发布时间】:2011-12-11 10:09:07
【问题描述】:

为了我自己的利益和可能的教育用途,我想为 Python 和 Cairo 制作一个类似于 pygame 的 API。但我不希望它完全是 pygame。我想把它做成一个半静态的绘图平台,使用 GTK/GDK 显示一个或多个图像,我想模仿 TiKZ(乳胶包)的优秀 API 原理。 PyGame API 还不错,但我并不满意。一个特别的问题是,我希望包通过将所有内容绘制到 pixbuf(使用 Cairo)来处理窗口刷新,并在窗口未发现时自动重绘 pixbuf。这样,最终程序员就不必担心窗口刷新。事实上,最终程序员不应该只需要编写一个类或函数,或者只需要编写一行代码就可以画出笑脸(比如说)。图形库也不必像在 TkInter 中那样维护更长的存储形状对象列表。 (至少,我希望开罗不要这样做违背我的意图。)

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

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


好的,我接受了发布的一个答案,因为它至少有点帮助。但简而言之,这是真正的重点。关键是当您在 GDK 中绘制东西时,包括使用 Cairo,GDK 会创建一个临时双缓冲区。预计当您处理公开事件时,您将重绘所有内容。但是如果你有一个非常复杂的图像,这是一个缓慢的过程,尤其是在 Python 中。因此,如果 Cairo 可以写入 permanent 双缓冲区而不是临时缓冲区,那会更好,然后将使用 GDK 公开该永久双缓冲区。一些开发人员想要解决这个问题。似乎有某种解决方案的项目之一是 Google Chromium --- 你有没有注意到 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()

另一个很快出现的棘手问题是,我希望这是一个所见即所得的绘图环境,可以立即绘制 Python 要求它绘制的内容 --- 并且可以扩展到动画。然而,大多数 GTK 示例并不是这样设置的:事件处理被推迟到我调用 gtk.main() 之前。 (或者在 Python 中,我惊讶地发现 raw_input() 也以某种方式刷新了 GTK 事件队列。)我发现 a nice explanation 以及 Python 示例是将事件控制权交给 GTK 的替代方案。最简单的解决方案,也可能是我将采用的解决方案是,只要您想这样做,就可以使用它来刷新事件缓冲区:

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

我需要做的最后一件事是刷新像素缓冲区和事件缓冲区。看起来这样做的一种方法是window.queue_draw()

【问题讨论】:

  • 我不确定您实际要求的是什么。您在寻找 Python+Cairo 教程吗?有一个herehere。对于 PyGTK,有一个不错的 Python API 文档,对于 cairo,您只需阅读 C API 文档并自己翻译成 Python。
  • maxy - 谢谢。它没有回答真正的问题,但这个例子告诉我人们通常如何在 Python 中使用 Cairo 和 GTK。

标签: python pygtk pycairo


【解决方案1】:

由于这对于评论来说太大了,所以我将其添加为回复。
这个问题不是很清楚。你的意思是问如何使用cairo绘图绘制到Gtk Widgets上?首先,没有什么叫做 GTK Pixbuf,我想你指的是 GDK Pixbuf。 GTK 中的大多数绘图工作都是在GDK 层完成的。如果您想了解窗口、绘图机制或图像处理,您应该查看 GDK 以获取更多详细信息。 These links 希望能帮助您对 cairo-gdk 交互有所了解。虽然我对 GTK、GDK 和 Cairo 的 python 绑定经验为零,但我认为如果您查找 gdk-cairo 示例,Google 会为您提供一些很好的资源。
希望这至少有一点帮助!

【讨论】:

  • 是的,对不起,我的意思是 GTK/GDK。我解决了这个问题。
  • 至于“这些链接”,它们是用典型的开罗字形书写的。 “set_source_color() 方法设置 cairo 上下文的源颜色。”什么是“源颜色”?也许我能猜到答案,我不确定。无论如何,乍一看,它看起来并没有回答这个问题。它告诉我如何将 Cairo 直接绘制到 GTK/GDK 窗口而不是像素缓冲区中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多