回答編集履歴

1

追記

2018/09/15 04:41

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
@@ -3,3 +3,135 @@
3
3
 
4
4
 
5
5
  後`Screen`には元々`on_pre_enter` `on_enter`があるので`begin_display()`の代わりになりますよ。
6
+
7
+
8
+
9
+ # 追記
10
+
11
+
12
+
13
+ `on_pre_enter()`内で`rp = ResultParts()` としてますが、これは新しいインスタンスを作ってるので、Kv言語上で作るように指示したインスタンスとは別物になります。
14
+
15
+
16
+
17
+ ```
18
+
19
+ <AllSCN>:
20
+
21
+ name: 'all'
22
+
23
+ us_p: us_v
24
+
25
+
26
+
27
+ BoxLayout:
28
+
29
+ orientation: 'vertical'
30
+
31
+
32
+
33
+ BoxLayout: #OpnSCN
34
+
35
+ Label:
36
+
37
+ id: us_v
38
+
39
+ BoxLayout: #ResultSCN
40
+
41
+ size_hint_y: 0.9
42
+
43
+ ResultParts: # <= このインスタンスとは別物
44
+
45
+ ```
46
+
47
+
48
+
49
+ その上この`rp`はWidgetTreeに繋がってすらいない(`add_widget()`されていない)ので当然表示されないです。やりたい事はKv言語上で書いた`ResultParts`に対する操作だと思うので、以下のようにしてidを割り当てて
50
+
51
+
52
+
53
+ ```
54
+
55
+ <AllSCN>:
56
+
57
+
58
+
59
+ BoxLayout: #ResultSCN
60
+
61
+ size_hint_y: 0.9
62
+
63
+ ResultParts:
64
+
65
+ id: resultparts
66
+
67
+ ```
68
+
69
+
70
+
71
+ 操作してください。
72
+
73
+
74
+
75
+ ```python
76
+
77
+ def on_pre_enter(self):
78
+
79
+ self.us_p.text = 'AAA'
80
+
81
+ rp = self.ids.resultparts # Kv言語上で書いたResultPartsを取得
82
+
83
+ rp.ls_p.text = 'BBB'
84
+
85
+ rp.linked = 'QQQ'
86
+
87
+ rp.display()
88
+
89
+ ```
90
+
91
+
92
+
93
+ > この場合だと、下段に'koteichi'が出そうなものですが、実際には'before'がでてしまいました。
94
+
95
+
96
+
97
+ AllScnはScreenManagerに加えられる最初の子なので`on_pre_enter()`は`sm.add_widget(AllSCN())`の時点で呼び出されます。それに対して `_once_after_init()`はClockで予約しているのでその後に呼び出されます。なので`before`が表示されるのは不思議なことではないです。これに対する対応はいくつか思い浮かびますが、その前に`_once_after_init()`内で`self.ls_p.text = 'before'`とするのは絶対に必要な処理ですか?例えば
98
+
99
+
100
+
101
+ ```
102
+
103
+ <ResultParts>
104
+
105
+ ls_p: ls_v
106
+
107
+ Label:
108
+
109
+ id: ls_v
110
+
111
+ text: 'XXX'
112
+
113
+ ```
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+ ```
122
+
123
+ <ResultParts>
124
+
125
+ ls_p: ls_v
126
+
127
+ Label:
128
+
129
+ id: ls_v
130
+
131
+ text: 'before'
132
+
133
+ ```
134
+
135
+
136
+
137
+ とできない理由が何かあるのですか?