回答編集履歴

2

widgetの派生classを作らないcodeを追記

2020/10/28 10:34

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -31,3 +31,109 @@
31
31
 
32
32
 
33
33
  それとwidgetの多重継承をしている理由は何ですか?`class MyBoxLayout(BoxLayout,FloatLayout):`は多分`class MyBoxLayout(BoxLayout)`と同じですし、`MyWidget`に関しても他のwidgetと多重継承して使うのが目的なら`MyWidget`自体は何も継承しなくていいです。(`class MyWidget:`だけで良い。Kivyの慣例に従うなら`XXXBehavior`という名前にしておくと読み手にとって分かりやすいです)。
34
+
35
+
36
+
37
+ # 追記: widgetの派生classを作らないやり方
38
+
39
+
40
+
41
+ ### 方法その1: Kv言語無し
42
+
43
+
44
+
45
+ ```python3
46
+
47
+ from kivy.app import App
48
+
49
+
50
+
51
+
52
+
53
+ class TameshiApp(App):
54
+
55
+ def build(self):
56
+
57
+ from kivy.factory import Factory as F
58
+
59
+ root = F.FloatLayout()
60
+
61
+ widget = F.Widget()
62
+
63
+ widget.bind(on_touch_down=lambda w, t: root.add_widget(
64
+
65
+ F.Button(text='Success', size_hint=(.2, .2, ), pos=t.pos)))
66
+
67
+ root.add_widget(widget)
68
+
69
+ root.add_widget(F.Label(text='Label', pos=(100, 100)))
70
+
71
+ root.add_widget(F.Button(text='Button', pos=(200, 200), size_hint=(.2, .2)))
72
+
73
+ return root
74
+
75
+
76
+
77
+ TameshiApp().run()
78
+
79
+ ```
80
+
81
+
82
+
83
+ ### 方法その2: Kv言語有り
84
+
85
+
86
+
87
+ ```python3
88
+
89
+ from kivy.app import App
90
+
91
+ from kivy.lang import Builder
92
+
93
+
94
+
95
+
96
+
97
+ KV_CODE = '''
98
+
99
+ #:import Button kivy.uix.button.Button
100
+
101
+
102
+
103
+ FloatLayout:
104
+
105
+ Widget:
106
+
107
+ on_touch_down: root.add_widget(Button(text='Success', size_hint=(.2, .2, ), pos=args[1].pos))
108
+
109
+ Label:
110
+
111
+ text: 'Label'
112
+
113
+ pos: 100, 100
114
+
115
+ Button:
116
+
117
+ text: 'Button'
118
+
119
+ pos: 200, 200
120
+
121
+ size_hint: .2, .2
122
+
123
+ '''
124
+
125
+
126
+
127
+
128
+
129
+ class TameshiApp(App):
130
+
131
+ def build(self):
132
+
133
+ return Builder.load_string(KV_CODE)
134
+
135
+
136
+
137
+ TameshiApp().run()
138
+
139
+ ```

1

説明の追加

2020/10/28 10:34

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -1 +1,33 @@
1
- `MakeButton`を定義するcodeはあっても作るcodeが何処にも無いです。なのでそれをいつ何個作りたいのか教えてください。それとwidgetの多重継承をしている理由は何ですか?`class MyBoxLayout(BoxLayout,FloatLayout):`は多分`class MyBoxLayout(BoxLayout)`と同じですし、`MyWidget`関しても他widgetと多重継承して使のが目的なら`MyWidget`自体は何も継承しなくていいです。(`class MyWidget:`だけで良い。Kivyの慣例従うなら`XXXBehavior`という名前にしおくと読み手にとって分かりやすです)。
1
+ `MakeButton`を定義するcodeはあっても作るcodeが何処にも無いです。作りたい以下うに作っ参照を持って
2
+
3
+
4
+
5
+ ```python
6
+
7
+ make_button = MakeButton(...)
8
+
9
+ 親.add_widget(make_button)
10
+
11
+ ```
12
+
13
+
14
+
15
+ その後
16
+
17
+
18
+
19
+ ```
20
+
21
+ def on_touch_down(self, touch):
22
+
23
+ make_button.pos = touch.pos
24
+
25
+ ```
26
+
27
+
28
+
29
+ といった風に位置を設定してあげればいいです。(本当はここで座標変換もしておいたほうが変更に強いcodeになって良いのですが、話がややこしくなるのでしてません)。
30
+
31
+
32
+
33
+ それとwidgetの多重継承をしている理由は何ですか?`class MyBoxLayout(BoxLayout,FloatLayout):`は多分`class MyBoxLayout(BoxLayout)`と同じですし、`MyWidget`に関しても他のwidgetと多重継承して使うのが目的なら`MyWidget`自体は何も継承しなくていいです。(`class MyWidget:`だけで良い。Kivyの慣例に従うなら`XXXBehavior`という名前にしておくと読み手にとって分かりやすいです)。