Tutorial :drawing a pixbuf onto a drawing area using pygtk and glade



Question:

i'm trying to make a GTK application in python where I can just draw a loaded image onto the screen where I click on it. The way I am trying to do this is by loading the image into a pixbuf file, and then drawing that pixbuf onto a drawing area.

the main line of code is here:

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)  

This should just draw the pixbuf onto the image in the top left corner, but nothing shows but the white image. I have tested that the pixbuf loads by putting it into a gtk image. What am I doing wrong here?


Solution:1

I found out I just need to get the function to call another expose event with widget.queue_draw() at the end of the function. The function was only being called once at the start, and there were no nodes available at this point so nothing was being drawn.


Solution:2

You can make use of cairo to do this. First, create a gtk.DrawingArea based class, and connect the expose-event to your expose func.

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

This will draw the image every time the expose-event is emited.


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »