5 votes

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

Je suis en train d'écrire une petite application utilisant PyGI qui va dessiner interactivement une ligne sur un Gtk.DrawingArea entre deux clics de souris. Mais je ne parviens pas à comprendre comment dessiner en utilisant le contexte du Caire aux coordonnées renvoyées par l'événement de clic de souris.

Comment le dessin doit-il être géré à partir de 'button-press-event' pour dessiner un motif similaire à celui produit par la callback 'draw' dans le code ci-joint ?

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

4voto

Siyuan Ren Points 792

Ce que vous devriez faire, c'est définir les variables qui sont dessinées dans le rappel de draw. Si vous voulez qu'il se redessine, vous pouvez utiliser cette fonction pour le forcer :

drawing_area.queue_draw()

Editar : 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X