рисование pixbuf на область рисования, используя pygtk и glade - PullRequest
2 голосов
/ 22 апреля 2009

Я пытаюсь создать приложение на GTK на python, где я могу просто нарисовать загруженное изображение на экране, где я нажимаю на него. Я пытаюсь это сделать, загрузив изображение в файл 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. Что я тут не так делаю?

Ответы [ 2 ]

2 голосов
/ 23 мая 2009

Вы можете использовать Каир, чтобы сделать это. Сначала создайте класс на основе gtk.DrawingArea и подключите событие expose к функции 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()

Это будет рисовать изображение каждый раз, когда происходит событие expose.

2 голосов
/ 22 апреля 2009

Я обнаружил, что мне просто нужно получить функцию для вызова другого события expose с widget.queue_draw() в конце функции. Функция вызывалась только один раз в начале, и в этот момент не было доступных узлов, поэтому ничего не рисовалось.

...