コード
下記のコードでImage Widgetを追加しています。
(確認用コードのため、不要な流れがありますがご了承ください)
python
1# -*- coding: utf-8 -*- 2from kivy.app import App 3from kivy.uix.image import Image 4from kivy.uix.floatlayout import FloatLayout 5 6class MainImage(Image): 7 def __init__(self, **kwargs): 8 self.source = kwargs["image"] 9 super(MainImage, self).__init__(**kwargs) 10 11class MainFrame(FloatLayout): 12 def __init__(self, **kwargs): 13 super(MainFrame, self).__init__(**kwargs) 14 package = {"image": "./ss.png"} 15 self.add_widget(MainImage(**package)) 16 17class MainApp(App): 18 def __init__(self, **kwargs): 19 super(MainApp, self).__init__(**kwargs) 20 21 def build(self): 22 root = MainFrame() 23 return root 24 25if __name__ == '__main__': 26 MainApp().run() 27
#:kivy 1.10 #-*- coding: utf-8 -*- <MainFrame>: <Image>: allow_stretch:True keep_ratio: True nocache:True <MainImage>: pos_hint:{'center_x':.5,'y':0 } size_hint:None,0.95 width: self.height*self.image_ratio
上記のコードは、add_widget時にImage sourceを入れて表示します。
その際、横幅をsourceに合わせた比率で表示という処理をしています。
目的
add_widgetを外しつつ、package変数をMainImageクラス内で使用する方法を考えています。
可能な限り MainImage内で処理(コード変更1のように)をできたらいいなというのが今回のご質問の目的です。
コード変更1
下記のコードはMainImageにPackageデータが送られていないため、エラーが表示されます。
python
1# -*- coding: utf-8 -*- 2from kivy.app import App 3from kivy.uix.image import Image 4from kivy.uix.floatlayout import FloatLayout 5 6class MainImage(Image): 7 def __init__(self, **kwargs): 8 self.source = kwargs["image"] 9 super(MainImage, self).__init__(**kwargs) 10 11class MainFrame(FloatLayout): 12 def __init__(self, **kwargs): 13 super(MainFrame, self).__init__(**kwargs) 14 package = {"image": "./ss.png"} 15 #self.add_widget(MainImage(**package)) 16 17class MainApp(App): 18 def __init__(self, **kwargs): 19 super(MainApp, self).__init__(**kwargs) 20 21 def build(self): 22 root = MainFrame() 23 return root 24 25if __name__ == '__main__': 26 MainApp().run() 27
#:kivy 1.10 #-*- coding: utf-8 -*- <MainFrame>: MainImage: #MainImage追加 <Image>: allow_stretch:True keep_ratio: True nocache:True <MainImage>: pos_hint:{'center_x':.5,'y':0 } size_hint:None,0.95 width: self.height*self.image_ratio
コード変更2(ObjectPropertyパターン)
add_widgetなしの目的は達成
一番目的に近いパターンです。
可能であればObjectPropertyなしでできないかというところです。
# -*- coding: utf-8 -*- from kivy.app import App from kivy.uix.image import Image from kivy.uix.floatlayout import FloatLayout from kivy.properties import ObjectProperty class MainImage(Image): def __init__(self, **kwargs): super(MainImage, self).__init__(**kwargs) def set(self,**package): self.source = package["image"] class MainFrame(FloatLayout): mainimage = ObjectProperty(None) def __init__(self, **kwargs): super(MainFrame, self).__init__(**kwargs) package = {"image": "./ss.png"} self.mainimage.set(**package) class MainApp(App): def __init__(self, **kwargs): super(MainApp, self).__init__(**kwargs) def build(self): root = MainFrame() return root if __name__ == '__main__': MainApp().run()
#:kivy 1.10 #-*- coding: utf-8 -*- <MainFrame>: mainimage:image1 MainImage: id:image1 <Image>: allow_stretch:True keep_ratio: True nocache:True <MainImage>: pos_hint:{'center_x':.5,'y':0 } size_hint:None,0.95 width: self.height*self.image_ratio
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/23 23:43
2018/07/24 03:45
2018/07/24 06:39 編集
2018/07/24 06:40
2018/07/24 07:31 編集
2018/07/24 10:34
2018/07/24 22:44