[cairo] Keeping previously drawn shapes after 'draw' event?
desktopdave
desktopdave at gmx.com
Fri Apr 3 16:54:17 UTC 2020
Hi,
I am trying to port a tkinter paint app(ms paint clone) to
pygobject/pygtk. Tkinter uses a sophisticated canvas widget, I am trying
to figure out how to emulate it using Gtk.DrawingArea.
I have worked out how to get a solid line(rectangle, oval etc) that
shrinks/grows as I move the mouse - before button1 release, here's the
basic code.
def draw_brush(self, da, event):
"""Draw something"""
ctx = cairo.Context(self.surface)
# Set white background
ctx.set_source_rgb(1, 1, 1)
ctx.paint()
# Draw selected shape chosen by user
self.execute_selected_method(ctx)
self.canvas.queue_draw()
My problem is that by setting the background white on each draw, I get
the solid growing/shrinking line(rectangle etc) effect needed, but it
also means that any previously drawn shape is erased at next draw event.
I need to somehow store the previous draws to the surface and reinstate
them on each draw event, so the user can paint a picture.
The method 'execute_selected_method(ctx)' simply selects the method for
the button that the user clicks on in a toolbox eg if the user selects
'line' button then selected method will be:
def draw_line(self, ctx):
ctx.set_source_rgb(*self.colours_dict[self.fill])
ctx.set_line_width(self.width)
ctx.move_to(self.start_x, self.start_y)
ctx.line_to(self.end_x, self.end_y)
ctx.stroke()
ctx.close_path()
I must admit that my understanding of cairo graphics is limited but I
get the basic principles.
Thanks for any help. If you need me to explain anything just reply and I
will - I can email my current pygobject(pygtk) source code if that helps.
Cheers all.
More information about the cairo
mailing list