如何将Popup中的文本发送至继承自Screen类的另一类的Label?
问题原因
你代码里的核心问题是Container().label.text = time这一行:每次调用Container()都会创建一个全新的Container实例,而不是你之前添加到ScreenManager中、界面上正在显示的那个实例。所以你修改的是新实例的Label文本,和当前界面的控件完全无关,自然看不到任何变化。
解决方案
这里提供两种简单有效的解决方式:
方法一:通过App实例获取目标Screen
直接在Popup的send方法里,通过当前运行的App实例找到ScreenManager,再定位到目标Container屏幕:
修改Keyboard类的send方法:
class Keyboard(Popup): def send(self): try: time = self.text_input.text except: time = '' # 获取当前App实例 app = App.get_running_app() # 通过ScreenManager获取名为'Time'的Container实例 target_screen = app.root.get_screen('Time') # 修改目标Label的文本 target_screen.label.text = time self.dismiss()
方法二:打开Popup时传递当前Screen
在打开Popup的时候,把当前的Container屏幕实例传递给Popup,这样Popup可以直接操作该实例的Label:
- 先修改kv语言中的按钮点击事件,传递当前Screen(
root代表当前Container实例):
Button: text: 'My popup' on_release: Factory.Keyboard(screen=root).open()
- 修改
Keyboard类,添加一个属性接收传递过来的Screen:
from kivy.properties import ObjectProperty # 需要导入这个 class Keyboard(Popup): screen = ObjectProperty(None) # 用于接收传递的Screen实例 def send(self): try: time = self.text_input.text except: time = '' # 直接操作传递过来的Screen的Label if self.screen: self.screen.label.text = time self.dismiss()
两种方法都能解决你的问题,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Feuer und Wasser
相关产品推荐
相关产品推荐

