Kivy开发:如何将.py文件文本传递到.kv的widget控件
解决方法
传值失败核心原因有两个:一是没有用Kivy支持的可监听属性存储情绪结果,二是kv里绑定的root.text路径错误——MainScreen实例本身没有text属性,且你写的**是Markdown加粗语法,KivyMD的Label不识别,会直接当普通文本显示。
第一步:修改.py文件
- 先在文件头部导入属性类:
from kivy.properties import StringProperty - 在
DipxyApp类中定义专门存储情绪结果的字符串属性,替代原来容易和控件属性重名的self.label:
class DipxyApp(MDApp): # 绑定用属性,默认空值,修改时自动触发界面更新 detected_emotion = StringProperty("") # 后面原有build、detect_emotion等方法保持不变
- 把
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
相关产品推荐
相关产品推荐

