Python GTK+ 画布

6 投票
1 回答
6673 浏览
提问于 2025-04-17 08:52

我现在正在通过PyGobject学习GTK+,需要一个类似画布的东西。我已经查过文档,发现有两个小部件看起来可以满足我的需求:GtkDrawingArea和GtkLayout。我需要一些基本的功能,比如填充矩形或画线……实际上这些功能在C语言中是可以用的,但我找不到如何在Python中使用它们的说明。你能推荐一个教程或手册,讲讲它们在Python中的用法吗?

如果你有更好的主意,能让我得到类似画布的东西,任何建议都非常感谢。我还在学习,只要能嵌入到我的Gtk应用程序中,我对任何解决方案都很满意。

1 个回答

13

为了更好地说明我在评论中提到的观点,我来分享一个简单的 PyGtk 示例。这个示例使用了一个 GtkDrawingArea 来创建一个画布,并通过 cairo 在上面绘图。

更正:你提到的是 PyGObject,也就是 Gtk+3,所以示例代码如下(主要的区别是没有 expose 事件,而是使用 draw,并且 cairo 上下文已经作为参数传递过来了):

#!/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)

w.show_all()

Gtk.main()

撰写回答