web-dev-qa-db-ja.com

pygiを使用してGtk.DrawingAreaでマウスクリックで描画する方法

私はPyGIを使用して、マウスクリックの間にインタラクティブにGtk.DrawingAreaに線を描画する小さなアプリケーションを作成しています。しかし、マウスクリックイベントによって返される座標でcairoコンテキストを使用して描画する方法を理解することはできません。

添付コードの「描画」コールバックによって生成されたパターンに似たパターンを描画するために、「button-press-event」から描画をどのように処理する必要がありますか?

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

あなたがすべきことは、描画コールバックで描画される変数を設定することです。自身を再描画する場合は、これを使用して次のことを強制できます。

drawing_area.queue_draw()

編集:使用できるコードの例を次に示します。

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