Kivy开发飞机告警APP:如何通过按钮id调取对应告警说明文本
数据存储方案选型
针对你的场景,不同存储方案的适用情况如下:
- 独立字符串变量:不推荐,告警数量增加后难以维护,查找内容需要用到反射逻辑,效率低且容易出错
- 每个告警创建单独类:属于过度设计,你仅需要存储说明字符串,不需要额外属性/方法的情况下完全没有必要
- 字典存储:首推方案,结构清晰、查找效率高、维护成本低,键直接对应告警ID,值可以是纯说明字符串,后续如果需要扩展故障等级、参考手册页码等属性,还可以改成嵌套字典,适配性极强
- 外部文件存储:如果你的告警内容需要非开发人员编辑,可以选择JSON、YAML这类结构化纯文本格式,不推荐用Word文档,需要额外安装第三方解析库,会增加应用打包体积和加载复杂度
代码修改方案
第一步:修改AOM.py用字典存储数据
# AOM.py caution_data = { "pri_inv": "所有与主逆变器相关的故障描述与解决方案:xxxxxx(约200字内容)", "l_ac_bus": "所有与左交流汇流条相关的故障描述与解决方案:xxxxxx(约200字内容)", "emer_lts_disarmed": "所有与应急灯解除待命相关的故障描述与解决方案:xxxxxx(约200字内容)" }
第二步:修改main.py的get_text方法
你之前传入的是按钮对象,直接取按钮的id作为字典的键查询即可:
def get_text(self, caution_btn): # 获取按钮ID作为查询key caution_id = caution_btn.id # 找不到对应ID时返回默认提示,避免报错 content = AOM.caution_data.get(caution_id, "未查询到对应告警的说明信息") print(content) # 后续要在text_screen显示的话,直接把content赋值给对应文本组件即可
你之前写AOM.caution报错的原因是:caution是你传入的参数名,不是AOM模块里的属性名,不能直接这么引用,用字典就可以避免这个问题。
补充问题解答
- 不需要把文本存放在main.py中,把数据单独放在AOM.py这类独立模块是最佳实践,实现了业务逻辑和配置数据的分离,后续修改告警内容不需要碰主逻辑代码
- 不建议存在Word文档中,如果你需要非开发人员编辑告警内容,推荐用JSON格式存储,和字典的适配性极强,读取逻辑非常简单:
示例aom_data.json文件:
{ "pri_inv": "主逆变器故障说明...", "l_ac_bus": "左交流汇流条故障说明..." }
AOM.py读取代码:
import json with open("aom_data.json", "r", encoding="utf-8") as f: caution_data = json.load(f)
其他逻辑完全不需要改动,和直接用字典的用法一致。
内容的提问来源于stack exchange,提问作者PW1990
相关产品推荐
相关产品推荐

