Start_python’s diary

ふたり暮らし

アラフィフ夫婦のフリーランスプラン

Kivy 範囲選択を行い座標を取り出す(Python 点線の描画)

はじめに

今回は範囲選択を行い座標を取り出します。図形の移動の応用です。

f:id:Start_python:20200111204748g:plain


範囲選択(点線の描画)

def __init__(self, **kwargs):
    super().__init__(**kwargs)

    self.lines = []

def on_image1_down(self, touch):
    self.x1 = touch.x
    self.y1 = touch.y
    if len(self.lines)>0:
        for line in self.lines:
            self.ids.image1.canvas.remove(line)
        self.lines = []
    with self.ids.image1.canvas:
        touch.ud['line'] = Line(points=[self.x1, self.y1], close='True')
        self.lines.append(touch.ud['line'])

def on_image1_move(self, touch):
    self.x2 = touch.x
    self.y2 = touch.y
    for line in self.lines:
        self.ids.image1.canvas.remove(line)
    self.lines = []
    with self.ids.image1.canvas:
        Color(0, 0, 0)
        touch.ud['line'] = Line(points=[self.x1, self.y1, self.x2, self.y1,
                                        self.x2, self.y2, self.x1, self.y2],
                                        close='True')
        self.lines.append(touch.ud['line'])
        Color(1, 1, 1)
        touch.ud['line'] = Line(points=[self.x1, self.y1, self.x2, self.y1,
                                        self.x2, self.y2, self.x1, self.y2],
                                        dash_offset=5, dash_length=3,
                                        close='True')
        self.lines.append(touch.ud['line'])

 

解説

座標 (x1, y1) (x2, y2) の範囲で点線の四角形を描画します。
クリックした座標が (x1, y1) で、ドラッグしている座標が (x2, y2) になります。

for line in self.lines:
    self.ids.image1.canvas.remove(line)

1つ前の点線を削除します。

touch.ud['line'] = Line(points=[self.x1, self.y1, self.x2, self.y1,
                                                    self.x2, self.y2, self.x1, self.y2],
                                                    dash_offset=5, dash_length=3,
                                                    close='True')

4つの点を点線で結んだ四角形を描画します。

 

まとめ

やり方自体はそんなに難しくありませんが、その方法を見つけるまでが難しいです。
あとは画像のトリミングを残すだけになりました。画像が縮小されている場合が多いので、座標の位置が表示されている画像のどの位置になるかの計算がたいへんそうです。

 

次回は画像のトリミングをしたいと思います。(今更ですが、外枠を先に表示して枠をドラッグしてトリミングのほうがよかったでしょうか。。)