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

回答編集履歴

1

追記

2018/09/15 04:41

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -1,3 +1,69 @@
1
1
  KivyのPropertyはClass属性じゃないので `ResultParts.ls_p.text = 'BBB'` じゃなくて `ResultPartsのインスタンス.ls_p.text = 'BBB'` と書かないといけないです。
2
2
 
3
- 後`Screen`には元々`on_pre_enter` `on_enter`があるので`begin_display()`の代わりになりますよ。
3
+ 後`Screen`には元々`on_pre_enter` `on_enter`があるので`begin_display()`の代わりになりますよ。
4
+
5
+ # 追記
6
+
7
+ `on_pre_enter()`内で`rp = ResultParts()` としてますが、これは新しいインスタンスを作ってるので、Kv言語上で作るように指示したインスタンスとは別物になります。
8
+
9
+ ```
10
+ <AllSCN>:
11
+ name: 'all'
12
+ us_p: us_v
13
+
14
+ BoxLayout:
15
+ orientation: 'vertical'
16
+
17
+ BoxLayout: #OpnSCN
18
+ Label:
19
+ id: us_v
20
+ BoxLayout: #ResultSCN
21
+ size_hint_y: 0.9
22
+ ResultParts: # <= このインスタンスとは別物
23
+ ```
24
+
25
+ その上この`rp`はWidgetTreeに繋がってすらいない(`add_widget()`されていない)ので当然表示されないです。やりたい事はKv言語上で書いた`ResultParts`に対する操作だと思うので、以下のようにしてidを割り当てて
26
+
27
+ ```
28
+ <AllSCN>:
29
+
30
+ BoxLayout: #ResultSCN
31
+ size_hint_y: 0.9
32
+ ResultParts:
33
+ id: resultparts
34
+ ```
35
+
36
+ 操作してください。
37
+
38
+ ```python
39
+ def on_pre_enter(self):
40
+ self.us_p.text = 'AAA'
41
+ rp = self.ids.resultparts # Kv言語上で書いたResultPartsを取得
42
+ rp.ls_p.text = 'BBB'
43
+ rp.linked = 'QQQ'
44
+ rp.display()
45
+ ```
46
+
47
+ > この場合だと、下段に'koteichi'が出そうなものですが、実際には'before'がでてしまいました。
48
+
49
+ AllScnはScreenManagerに加えられる最初の子なので`on_pre_enter()`は`sm.add_widget(AllSCN())`の時点で呼び出されます。それに対して `_once_after_init()`はClockで予約しているのでその後に呼び出されます。なので`before`が表示されるのは不思議なことではないです。これに対する対応はいくつか思い浮かびますが、その前に`_once_after_init()`内で`self.ls_p.text = 'before'`とするのは絶対に必要な処理ですか?例えば
50
+
51
+ ```
52
+ <ResultParts>
53
+ ls_p: ls_v
54
+ Label:
55
+ id: ls_v
56
+ text: 'XXX'
57
+ ```
58
+
59
+
60
+
61
+ ```
62
+ <ResultParts>
63
+ ls_p: ls_v
64
+ Label:
65
+ id: ls_v
66
+ text: 'before'
67
+ ```
68
+
69
+ とできない理由が何かあるのですか?