<h2>问题</h2>
<h2>1。AttributeError-我的标签</h2>
<p>在kv文件中,缺少<code>id: my_label</code>。在</p>
<h2>2。填充我的屏幕之前_标签.text在</h2>
<p>填充<code>my_label.text</code>是在切换屏幕后完成的,<code>self.manager.current = "three"</code>。在</p>
<h2>3。屏幕三-空白/黑色窗口</h2>
<p><strong><em>屏幕三</em></strong>实例化两次。第一个实例由<code>ScreenThree:</code>在kv文件中创建(这相当于Python代码中的<code>ScreenThree()</code>)。第二个实例是用Python代码<code>screenThree = ScreenThree()</code>创建的。在</p>
<p><code>my_label.text</code>的填充在第二个实例/对象中,而不是在第一个实例中。因此,screentree是空白/黑色窗口,因为app使用的是kv文件的视图,即screentree的第一个实例。在</p>
<h3>注:</h3>
<p>如果添加<code>id()</code>函数,它将为屏幕显示不同的内存位置。在</p>
<pre><code>def pressedFunction(self, instance, *args):
self.manager.current = "three"
self.debug()
screenThree = ScreenThree()
print("screenThree={0}, id(screenThree)={1}".format(screenThree, id(screenThree)))
self.debug()
text = str(instance.text)
screenThree.changing_label(text)
def debug(self):
print("\ndebug:")
print("\tself.manager.screen_names=", self.manager.screen_names)
print("\tself.manager.screens=", self.manager.screens)
for x in self.manager.screens:
print("\t\tscreen={0}, id(screen)={1}".format(x, id(x)))
</code></pre>
<h2>解决方案</h2>
<h2>kv文件</h2>
<ol>
<li>在<code>ScreenTwo:</code>下添加<code>id: screen_two</code>。这将用于引用屏幕2中的类属性/方法。在</li>
<li>将<code>app.root.current = "two"</code>替换为<code>root.manager.current = "two"</code>,因为默认情况下每个屏幕都有一个属性<code>manager</code></li>
<li>在^{<cd15>下添加<code>id: my_label</code></li>
</ol>
<h2>Python代码</h2>
<ol>
<li>添加import语句,<code>from kivy.properties import StringProperty</code></li>
<li>在ScreenTwo()类中声明StringProperty,<code>text = StringProperty('')</code>,这样就不需要传递参数,也不需要封装。在</li>
<li>在pressedFunction()方法中,将<code>text = str(instance.text)</code>替换为<code>self.text = str(instance.text)</code></li>
<li>切换屏幕前填充文本</li>
<li>在ScreenThree()类中,将<code>changing_label()</code>方法重命名为<code>on_pre_enter()</code>方法,并从参数列表中删除{<cd22>}。在</li>
<li>替换<code>self.ids.my_label.text = text' with</code>self.ids.my_标签。文本=self.manager.ids.屏幕_二、文本`在</li>
<li><strong><em>可选:</em></strong>减少使用的内存,将<code>return presentation</code>替换为<code>return Builder.load_file("example.kv")</code>,并删除{<cd26>}</li>
</ol>
<h2>示例</h2>
<h2>在主.py在</h2>
^{pr2}$
<h2>在示例.kv在</h2>
<pre><code>#:kivy 1.11.0
ScreenManagement:
ScreenOne:
ScreenTwo:
id: screen_two
ScreenThree:
<ScreenOne>:
BoxLayout:
Button:
text: "press me"
on_release: root.manager.current = "two" # every screen has a default property manager
<ScreenTwo>:
name: "two"
BoxLayout:
id: container
<ScreenThree>:
name: "three"
BoxLayout:
id: labelContainer
Label:
id: my_label
text: ""
</code></pre>
<h2>输出</h2>
<p><a href="https://i.stack.imgur.com/O9P7n.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/O9P7n.png" alt="Img01 - ScreenTwo"/></a>
<a href="https://i.stack.imgur.com/Bh8op.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Bh8op.png" alt="Img02 - ScreenThree Button1's Text displayed"/></a>
<a href="https://i.stack.imgur.com/qTW5W.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/qTW5W.png" alt="Img03 - ScreenThree Button2's Text displayed"/></a></p>