web-dev-qa-db-fra.com

Comment dessiner sur un clic de souris dans Gtk.DrawingArea en utilisant pygi

J'écris une petite application en utilisant PyGI qui tracera de manière interactive une ligne sur un Gtk.DrawingArea entre des clics de souris. Mais je suis incapable de comprendre comment dessiner en utilisant le contexte cairo aux coordonnées renvoyées par l'événement clic de souris.

Comment le dessin doit-il être manipulé à partir de 'bouton-presse-événement' pour dessiner un motif similaire à celui produit par le rappel 'draw' dans le code attaché?

class MyApp(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Draw on button press")
        self.set_size_request(800, 500)
        self.connect('delete-event', Gtk.main_quit)

        self.drawing_area = Gtk.DrawingArea()
        self.drawing_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) 
        self.drawing_area.connect('draw', self.on_drawing_area_draw)
        self.drawing_area.connect('button-press-event', self.on_drawing_area_button_press)
        self.drawing_area.show()
        self.add(self.drawing_area)

        self.show_all()

    def on_drawing_area_button_press(self, widget, event):
        print "Mouse clicked... at ", event.x, ", ", event.y
        # How to draw a line starting at this point on the drawing area?        
        return True

    def on_drawing_area_draw(self, drawing_area, cairo_context):
        cairo_context.move_to(50, 50)
        cairo_context.rel_line_to(0, 200)
        cairo_context.rel_line_to(200, 0)
        cairo_context.rel_line_to(0, -200)
        cairo_context.set_source_rgb(0, 0, 0)
        cairo_context.stroke()

        return False

app = MyApp()
Gtk.main()
4
csrins

Ce que vous devez faire, c'est définir les variables dessinées dans le rappel de tirage. Si vous voulez qu'il se redessine, vous pouvez l'utiliser pour le forcer à:

drawing_area.queue_draw()

Edit: Voici un exemple de code que vous pouvez utiliser:

clicks = [];

def on_drawing_area_button_press(self, widget, event):
    print "Mouse clicked... at ", event.x, ", ", event.y
    clicks.append([event.x, event.y])
    drawing_area.queue_draw()

    return True

def on_drawing_area_draw(self, drawing_area, cairo_context):
    cairo_context.move_to(50, 50)
    for point in clicks
        cairo_context.line_to(point[0], point[1])

    cairo_context.stroke()

    return False
3
Sam Bickley