2009-04-22 132 views
1

我试图在python中创建一个GTK应用程序,我只需在屏幕上绘制加载的图像,然后点击它。我试图这样做的方法是将图像加载到pixbuf文件中,然后将该pixbuf绘制到绘图区域。使用pygtk和glade将绘图区域绘制到绘图区域

代码的主线是在这里:

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到图像的左上角,但没有显示,但白色图像。我已经通过将它放入gtk图像来测试pixbuf加载。我在这里做错了什么?

回答

2

我发现我只是需要调用另一个揭露事件的函数widget.queue_draw()函数结束。该函数在开始时只被调用一次,并且此时没有节点可用,因此没有绘制任何节点。

1

你可以使用开罗做到这一点。首先,创建一个基于gtk.DrawingArea的类,并将expose-event连接到你的公开函数。

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() 

这会在每次暴露事件发生时绘制图像。