回答編集履歴

4

追記

2018/07/24 07:17

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -145,3 +145,51 @@
145
145
 
146
146
 
147
147
  とは書きましたが、このコードがそのまま使えるとは限らないです。このコードは単にKivyのPropertyをClass属性のように扱ってはいけない事を示したかっだけです。実際`コード変更2(対応パターン)`の修正後のコードは`MainFrame.__init__()`内で`MainImage`のInstanceを作ってすぐに捨てるという無意味な物になってます。
148
+
149
+
150
+
151
+ # 追記3
152
+
153
+
154
+
155
+ > 可能であればObjectPropertyなしでできないかというところです。
156
+
157
+
158
+
159
+ `コード変更2(ObjectPropertyパターン)`のコードを
160
+
161
+
162
+
163
+ ```python
164
+
165
+
166
+
167
+ class MainFrame(FloatLayout):
168
+
169
+
170
+
171
+ def __init__(self, **kwargs):
172
+
173
+ super(MainFrame, self).__init__(**kwargs)
174
+
175
+ package = {"image": "./ss.png"}
176
+
177
+ self.ids.image1.set(**package)
178
+
179
+ ```
180
+
181
+
182
+
183
+ ```text
184
+
185
+ <MainFrame>:
186
+
187
+ MainImage:
188
+
189
+ id:image1
190
+
191
+ ```
192
+
193
+
194
+
195
+ とすればできますよ。

3

追記

2018/07/24 07:17

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- # 追記
33
+ # 追記1
34
34
 
35
35
 
36
36
 
@@ -123,3 +123,25 @@
123
123
 
124
124
 
125
125
  ただ個人的にあまり利は感じないですが。
126
+
127
+
128
+
129
+ # 追記2
130
+
131
+
132
+
133
+ 説明が足らなかったです。私は
134
+
135
+
136
+
137
+ ```python
138
+
139
+ image = MainImage(...)
140
+
141
+ image.source = '...'
142
+
143
+ ```
144
+
145
+
146
+
147
+ とは書きましたが、このコードがそのまま使えるとは限らないです。このコードは単にKivyのPropertyをClass属性のように扱ってはいけない事を示したかっだけです。実際`コード変更2(対応パターン)`の修正後のコードは`MainFrame.__init__()`内で`MainImage`のInstanceを作ってすぐに捨てるという無意味な物になってます。

2

追記

2018/07/24 02:35

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -27,3 +27,99 @@
27
27
  image.source = '...'
28
28
 
29
29
  ```
30
+
31
+
32
+
33
+ # 追記
34
+
35
+
36
+
37
+ > 表示する要素(Image,Label)の大まかなものは決めて、package変数で詳細な(source,posなど)の要素は決めたいためです。
38
+
39
+
40
+
41
+ う〜ん例えばですが以下のようにする事で`package`という辞書の値を元に`MainImage`のPropertyが決まるようにはできます。
42
+
43
+
44
+
45
+ ```python
46
+
47
+ # -*- coding: utf-8 -*-
48
+
49
+ from kivy.app import App
50
+
51
+ from kivy.lang import Builder
52
+
53
+ from kivy.properties import DictProperty
54
+
55
+ from kivy.factory import Factory # Factoryを使うとWidgetの種類毎にimport文を書かなくて済む
56
+
57
+
58
+
59
+
60
+
61
+ Builder.load_string(r'''
62
+
63
+ <MainFrame>:
64
+
65
+ MainImage:
66
+
67
+ package:
68
+
69
+ {
70
+
71
+ 'image': 'data/logo/kivy-icon-512.png', # この画像は元からKivyが持っているので自分で用意する必要はない
72
+
73
+ }
74
+
75
+ <MainImage>:
76
+
77
+ source: self.package['image']
78
+
79
+ ''')
80
+
81
+
82
+
83
+
84
+
85
+ class MainFrame(Factory.FloatLayout):
86
+
87
+ pass
88
+
89
+
90
+
91
+
92
+
93
+ class MainImage(Factory.Image):
94
+
95
+ package = DictProperty(defaultvalue={
96
+
97
+ 'image': '',
98
+
99
+ })
100
+
101
+
102
+
103
+
104
+
105
+ class TestApp(App):
106
+
107
+
108
+
109
+ def build(self):
110
+
111
+ return MainFrame()
112
+
113
+
114
+
115
+
116
+
117
+ if __name__ == '__main__':
118
+
119
+ TestApp().run()
120
+
121
+ ```
122
+
123
+
124
+
125
+ ただ個人的にあまり利は感じないですが。

1

追記

2018/07/24 02:01

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- それと、コード中に`MainImage.source = "./ss.png"`という代入文がありますが、こういった書き方は絶対にしてはいけないです。必ずInstance経由でPropertyに対して操作してください。
19
+ それと、コード中に`MainImage.source = "./ss.png"`という代入文がありますが、こういった書き方は絶対にしてはいけないです。必ずInstance経由でPropertyに対して操作してください。(KivyのPropertyはInstance毎に存在していて、通常のPythonのClass属性のように共有されていません)
20
20
 
21
21
 
22
22