質問するログイン新規登録

回答編集履歴

4

追記

2018/07/24 07:17

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -71,4 +71,28 @@
71
71
  image.source = '...'
72
72
  ```
73
73
 
74
- とは書きましたが、このコードがそのまま使えるとは限らないです。このコードは単にKivyのPropertyをClass属性のように扱ってはいけない事を示したかっだけです。実際`コード変更2(対応パターン)`の修正後のコードは`MainFrame.__init__()`内で`MainImage`のInstanceを作ってすぐに捨てるという無意味な物になってます。
74
+ とは書きましたが、このコードがそのまま使えるとは限らないです。このコードは単にKivyのPropertyをClass属性のように扱ってはいけない事を示したかっだけです。実際`コード変更2(対応パターン)`の修正後のコードは`MainFrame.__init__()`内で`MainImage`のInstanceを作ってすぐに捨てるという無意味な物になってます。
75
+
76
+ # 追記3
77
+
78
+ > 可能であればObjectPropertyなしでできないかというところです。
79
+
80
+ `コード変更2(ObjectPropertyパターン)`のコードを
81
+
82
+ ```python
83
+
84
+ class MainFrame(FloatLayout):
85
+
86
+ def __init__(self, **kwargs):
87
+ super(MainFrame, self).__init__(**kwargs)
88
+ package = {"image": "./ss.png"}
89
+ self.ids.image1.set(**package)
90
+ ```
91
+
92
+ ```text
93
+ <MainFrame>:
94
+ MainImage:
95
+ id:image1
96
+ ```
97
+
98
+ とすればできますよ。

3

追記

2018/07/24 07:17

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  image.source = '...'
15
15
  ```
16
16
 
17
- # 追記
17
+ # 追記1
18
18
 
19
19
  > 表示する要素(Image,Label)の大まかなものは決めて、package変数で詳細な(source,posなど)の要素は決めたいためです。
20
20
 
@@ -60,4 +60,15 @@
60
60
  TestApp().run()
61
61
  ```
62
62
 
63
- ただ個人的にあまり利は感じないですが。
63
+ ただ個人的にあまり利は感じないですが。
64
+
65
+ # 追記2
66
+
67
+ 説明が足らなかったです。私は
68
+
69
+ ```python
70
+ image = MainImage(...)
71
+ image.source = '...'
72
+ ```
73
+
74
+ とは書きましたが、このコードがそのまま使えるとは限らないです。このコードは単にKivyのPropertyをClass属性のように扱ってはいけない事を示したかっだけです。実際`コード変更2(対応パターン)`の修正後のコードは`MainFrame.__init__()`内で`MainImage`のInstanceを作ってすぐに捨てるという無意味な物になってます。

2

追記

2018/07/24 02:35

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -12,4 +12,52 @@
12
12
  ```python
13
13
  image = MainImage(...)
14
14
  image.source = '...'
15
- ```
15
+ ```
16
+
17
+ # 追記
18
+
19
+ > 表示する要素(Image,Label)の大まかなものは決めて、package変数で詳細な(source,posなど)の要素は決めたいためです。
20
+
21
+ う〜ん例えばですが以下のようにする事で`package`という辞書の値を元に`MainImage`のPropertyが決まるようにはできます。
22
+
23
+ ```python
24
+ # -*- coding: utf-8 -*-
25
+ from kivy.app import App
26
+ from kivy.lang import Builder
27
+ from kivy.properties import DictProperty
28
+ from kivy.factory import Factory # Factoryを使うとWidgetの種類毎にimport文を書かなくて済む
29
+
30
+
31
+ Builder.load_string(r'''
32
+ <MainFrame>:
33
+ MainImage:
34
+ package:
35
+ {
36
+ 'image': 'data/logo/kivy-icon-512.png', # この画像は元からKivyが持っているので自分で用意する必要はない
37
+ }
38
+ <MainImage>:
39
+ source: self.package['image']
40
+ ''')
41
+
42
+
43
+ class MainFrame(Factory.FloatLayout):
44
+ pass
45
+
46
+
47
+ class MainImage(Factory.Image):
48
+ package = DictProperty(defaultvalue={
49
+ 'image': '',
50
+ })
51
+
52
+
53
+ class TestApp(App):
54
+
55
+ def build(self):
56
+ return MainFrame()
57
+
58
+
59
+ if __name__ == '__main__':
60
+ TestApp().run()
61
+ ```
62
+
63
+ ただ個人的にあまり利は感じないですが。

1

追記

2018/07/24 02:01

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -7,7 +7,7 @@
7
7
  pos_hint: {...}
8
8
  ```
9
9
 
10
- それと、コード中に`MainImage.source = "./ss.png"`という代入文がありますが、こういった書き方は絶対にしてはいけないです。必ずInstance経由でPropertyに対して操作してください。
10
+ それと、コード中に`MainImage.source = "./ss.png"`という代入文がありますが、こういった書き方は絶対にしてはいけないです。必ずInstance経由でPropertyに対して操作してください。(KivyのPropertyはInstance毎に存在していて、通常のPythonのClass属性のように共有されていません)
11
11
 
12
12
  ```python
13
13
  image = MainImage(...)