回答編集履歴

1

追記

2018/11/30 10:00

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -1 +1,27 @@
1
1
  widgetにKv言語で書かれた物を反映させるには、widgetのinstanceを作る前にKv言語のコードを読み込ませないといけないです。TestAppクラスが自身の名前を元に`test.kv`を読みに行くのは`TestApp().run()`の中([この部分](https://github.com/kivy/kivy/blob/372b81964f55d2ca74641944ab8c908172306e59/kivy/app.py#L799))なので、`TestApp().run()`を呼ぶ前に作った`MenuScreen`と`SettingsScreen`のinstanceはKv言語で書かれた定義が無い状態になりますね。
2
+
3
+
4
+
5
+ なので最初の失敗例を正しく動作させるには`MenuScreen`と`SettingsScreen`のinstanceを作る前に以下のように明示的にKv言語のコードを読み込めばいいです。
6
+
7
+
8
+
9
+ ```python
10
+
11
+ from kivy.lang import Builder
12
+
13
+
14
+
15
+ Builder.load_file('test.kv')
16
+
17
+ sm = ScreenManager()
18
+
19
+ sm.add_widget(MenuScreen(name='menu'))
20
+
21
+ sm.add_widget(SettingsScreen(name='settings'))
22
+
23
+ ```
24
+
25
+
26
+
27
+ (このやり方の場合、`test.kv`は別の名前に変えたほうがいいかもしれないです。)