You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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:

  1. 先修改kv语言中的按钮点击事件,传递当前Screen(root代表当前Container实例):
Button:
    text: 'My popup'
    on_release: Factory.Keyboard(screen=root).open()
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:10:30