Python GTK+ Canvas

6 人关注

我目前正在通过PyGobject学习GTK+,需要一个类似画布的东西。我已经搜索了文档,发现有两个小部件似乎可以完成这个工作。GtkDrawingArea和GtkLayout。我需要一些基本的功能,如fillrect或drawline ...事实上,这些函数在c语言中是可用的,但我找不到如何在python中使用它们的方法。你能推荐一个关于它们在python中的对应关系的教程或手册吗?

如果你有更好的主意,如何获得类似于画布的东西,请给我一个提示。我还在学习,只要它能嵌入我的Gtk应用程序中,我就会满足于任何解决方案。

5 个评论
适当的widget是GtkDrawingArea。我现在没有任何样本,但你应该用pycairo来画到它,作为对 expose 事件的一个反应。
lhk
这意味着GtkDrawingArea只是一个容器,可以被其他框架填充?在GTK+中是否有任何画布?
@rodrigo 在gtk3中, expose-event 信号已经被 draw 信号取代,根据 参考手册 .
lhk
我阅读了关于pycairo和 "填充 "绘图区的可能性。似乎可以让pygame来做这个工作。然而,人们普遍认为,将pygame集成到gtk+中意味着麻烦。事件系统/更新机制会崩溃。我不得不承认:由于我已经使用过pygame,我想再次使用它,所以我有一点偏见。
lhk
是什么让pycairo脱颖而出?@rodrigo 你为什么推荐它?
python
user-interface
canvas
gtk
pygobject
lhk
lhk
发布于 2011-12-23
1 个回答
rodrigo
rodrigo
发布于 2011-12-23
已采纳
0 人赞同

为了说明我在评论中提出的观点,让我发布一个快速'n'dirty PyGtk的例子,它使用 GtkDrawingArea 来创建一个画布,并使用cairo在其中作画。

CORRECTION 你说的是PyGObject,也就是Gtk+3,所以例子如下(主要区别是没有 expose 事件,而是 draw ,并且已经把一个开罗上下文作为参数传递了)。

#!/usr/bin/python
from gi.repository import Gtk
import cairo
import math
def OnDraw(w, cr):
    cr.set_source_rgb(1, 1, 0)
    cr.arc(320,240,100, 0, 2*math.pi)
    cr.fill_preserve()
    cr.set_source_rgb(0, 0, 0)
    cr.stroke()
    cr.arc(280,210,20, 0, 2*math.pi)
    cr.arc(360,210,20, 0, 2*math.pi)
    cr.fill()
    cr.set_line_width(10)
    cr.set_line_cap(cairo.LINE_CAP_ROUND)
    cr.arc(320, 240, 60, math.pi/4, math.pi*3/4)
    cr.stroke()
w = Gtk.Window()
w.set_default_size(640, 480)
a = Gtk.DrawingArea()
w.add(a)
w.connect('destroy', Gtk.main_quit)
a.connect('draw', OnDraw)