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

Kivy开发:如何将.py文件文本传递到.kv的widget控件

解决方法

传值失败核心原因有两个:一是没有用Kivy支持的可监听属性存储情绪结果,二是kv里绑定的root.text路径错误——MainScreen实例本身没有text属性,且你写的**是Markdown加粗语法,KivyMD的Label不识别,会直接当普通文本显示。

第一步:修改.py文件

  1. 先在文件头部导入属性类:
    from kivy.properties import StringProperty
  2. 在DipxyApp类中定义专门存储情绪结果的字符串属性,替代原来容易和控件属性重名的self.label:
class DipxyApp(MDApp):
    # 绑定用属性,默认空值,修改时自动触发界面更新
    detected_emotion = StringProperty("")
    # 后面原有build、detect_emotion等方法保持不变
  1. 把load_video方法中原来给self.label赋值的逻辑,改成给新增的属性赋值:
# 原代码 self.label = le.classes_[j] 替换为
self.detected_emotion = le.classes_[j]
print(self.detected_emotion)

第二步:修改.kv文件

找到id为display_emotion的MDLabel,修正text属性的绑定路径,删掉无效的**标记:

MDLabel:
    id: display_emotion
    # 直接绑定App实例的情绪属性,值变化时界面自动刷新
    text: app.detected_emotion
    font_size: 26
    bold: True
    pos_hint: {"center_x": .6, "center_y": .43}

改完之后运行,点击Capture Emotion启动检测,识别到的情绪结果会自动显示在对应Label上,不需要额外写刷新逻辑。

可选:手动赋值方案

如果不想用属性绑定,也可以在检测到情绪结果后,通过窗口管理器拿到MainScreen实例,直接给控件的text属性赋值,不需要新增StringProperty。在load_video拿到情绪结果的位置加两行代码即可:

preds = model.predict(face)[0]
j = np.argmax(preds)
emotion_text = le.classes_[j]
# 手动获取主屏幕实例,给目标Label赋值
main_screen = self.wm.get_screen('main_screen')
main_screen.ids.display_emotion.text = emotion_text
print(emotion_text)

这种方式逻辑直接,但后续如果要在多个位置用到情绪值,需要重复写找控件的逻辑,不如属性绑定维护方便。


内容的提问来源于stack exchange,提问作者Syarifah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:39:19