前提・実現したいこと
Python Kivyの勉強のため、kivy_garden.painterでお絵かきアプリを作ろうとしています。
公式exampleの通りに実行すれば線は描画できますが、DEMO動画
https://www.youtube.com/watch?v=gsqgfqunKkg
の「Fill」機能が実現できません。
発生している問題・エラーメッセージ
AttributeError: 'PainterWidget' object has no attribute 'add_area_graphics'
該当のソースコード
kivy_painter.py
Python
1 2from kivy.app import App 3from kivy.lang import Builder 4from kivy.uix.widget import Widget 5from kivy.uix.behaviors.focus import FocusBehavior 6from kivy_garden.painter import PaintCanvasBehavior, PaintShape 7from kivy.graphics.texture import Texture 8from kivy.graphics import Rectangle 9from kivy.uix.boxlayout import BoxLayout 10from kivy.uix.button import Button 11from kivy.uix.widget import Widget 12from kivy.uix.image import Image 13 14class PainterWidget(PaintCanvasBehavior, FocusBehavior, Widget, PaintShape): 15 def create_shape_with_touch(self, touch): 16 shape = super(PainterWidget, self).create_shape_with_touch(touch) 17 if shape is not None: 18 shape.add_shape_to_canvas(self) 19 return shape 20 21 def add_shape(self, shape): 22 if super(PainterWidget, self).add_shape(shape): 23 print(shape) 24 shape.add_shape_to_canvas(self) 25 return True 26 return False 27 28 29class MainScreen(BoxLayout): 30 def __init__(self, **kwargs): 31 super().__init__(**kwargs) 32 33 34class MyApp(App): 35 def build(self): 36 MS = MainScreen() 37 return MS 38 39 40if __name__ == '__main__': 41 Builder.load_file('kivy_painter.kv') 42 MyApp().run()
kivy_painter.kv
kivy
1#:kivy 1.11.1 2 3<MainScreen>: 4 BoxLayout: 5 orientation: 'vertical' 6 7 PainterWidget: 8 id: painter_widget 9 group: 'group_p' 10 draw_mode: mode.text or 'freeform' 11 locked: lock.state == 'down' 12 multiselect: multiselect.state == 'down' 13 canvas.before: 14 Color: 15 rgba: 0, 1, 1, 0 # unabled 16 Rectangle: 17 pos: self.pos 18 size: self.size 19 20 BoxLayout: 21 size_hint_y: None 22 height: "50dp" 23 spacing: '20dp' 24 Spinner: 25 id: mode 26 values: ['circle', 'ellipse', 'polygon', 'freeform', 'none'] 27 text: 'freeform' 28 ToggleButton: 29 id: lock 30 text: "Lock" 31 ToggleButton: 32 id: multiselect 33 text: "Multi-select" 34 Button: 35 text: 'clear' 36 on_release: painter_widget.canvas.clear() 37 Button: 38 text: 'fill' 39 on_release: painter_widget.add_area_graphics('group_p', painter_widget.canvas) 40
試したこと
https://kivy-garden.github.io/painter/flower.html#painter-widget
の add_area_graphics_to_canvas(name, canvas)
が該当すると考えましたが、
AttributeError: 'PainterWidget' object has no attribute 'add_area_graphics'
となってしまいました。
代案として、opencvのcv2.floodFillを検討しましたが、塗りつぶし開始地点を手動で指定せねばならず、自動で塗りつぶすアルゴリズムを考え付くことができませんでした。
kivy_garden.painter以外でも、描いた領域を塗りつぶす方法がありましたらご教授願いたいです。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Windows10
python==3.6.7
kivy==1.11.1
kivy-garden.painter==0.2.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/25 13:28
2020/01/27 13:46 編集
2020/01/30 09:19