2009-04-22 4 views
1

파이썬에서 GTK 응용 프로그램을 만들려고합니다. 여기에서 클릭 한 화면에로드 된 이미지를 그릴 수 있습니다. 이 작업을 수행하는 방법은 이미지를 pixbuf 파일에로드 한 다음 pixbuf를 그리기 영역에 그립니다.pygtk 및 glade를 사용하여 그림 영역에 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 이미지에 넣음으로써로드되는지 테스트했다. 여기서 내가 뭘 잘못하고 있니?

답변

2

나는 기능이 끝날 때 widget.queue_draw()이라는 또 다른 노출 이벤트를 호출해야한다는 것을 알았습니다. 이 함수는 시작시 한 번만 호출되었으며이 시점에서는 사용할 수있는 노드가 없었으므로 아무 것도 그려지지 않았습니다.

1

카이로를 사용하여이를 수행 할 수 있습니다. 먼저 gtk.DrawingArea 기반 클래스를 만들고 expose-event를 expose 함수에 연결합니다.

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

이렇게하면 노출 이벤트가 발생할 때마다 이미지가 그려집니다.