3

我正在尝试在 python 中创建一个 GTK 应用程序,我可以在其中将加载的图像绘制到单击它的屏幕上。我尝试这样做的方法是将图像加载到 pixbuf 文件中,然后将该 pixbuf 绘制到绘图区域。

主要代码行在这里:

def drawing_refresh(self, widget, event):
    #clear the screen
    widget.window.draw_rectangle(widget.get_style().white_gc, True, 0, 0, 400, 400) 
    for n in self.nodes:
         widget.window.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL],
                                   self.node_image, 0, 0, 0, 0)

这应该只是将 pixbuf 绘制到左上角的图像上,但除了白色图像之外什么都没有显示。我已经通过将 pixbuf 放入 gtk 图像来测试它是否可以加载。我在这里做错了什么?

4

2 回答 2

3

我发现我只需要让函数在widget.queue_draw()函数末尾调用另一个公开事件。该函数在开始时仅被调用一次,此时没有可用的节点,因此没有绘制任何内容。

于 2009-04-22T07:46:15.337 回答
3

您可以使用 cairo 来执行此操作。首先,创建一个基于 gtk.DrawingArea 的类,并将暴露事件连接到您的暴露函数。

class draw(gtk.gdk.DrawingArea):
    def __init__(self):
        self.connect('expose-event', self._do_expose)
        self.pixbuf = self.gen_pixbuf_from_file(PATH_TO_THE_FILE)

    def _do_expose(self, widget, event):
        cr = self.window.cairo_create()
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.set_source_rgb(1,1,1)
        cr.paint()
        cr.set_source_pixbuf(self.pixbuf, 0, 0)
        cr.paint()

这将在每次发出暴露事件时绘制图像。

于 2009-05-23T03:41:31.560 回答