如何在Python3中通过StringProperty将JSON变量传递到Kivy?
问题解决:Kivy中StringProperty无法传递JSON值到Kv文件
核心问题分析
你的代码里,check_data_login方法错误地重新创建了StringProperty实例,而非更新类已定义的vod_text属性。Kv文件绑定的是屏幕实例的vod_text属性,直接新建StringProperty不会触发UI更新。
修改方案
1. 修正main.py中的属性赋值
把check_data_login方法里的:
vod_text = StringProperty(taxi)
替换成:
self.vod_text = taxi
这样才会更新屏幕实例的vod_text属性,触发Kv文件中绑定的UI元素同步更新。
2. 可选优化:根据输入Code匹配JSON数据
当前代码固定取JSON数组第一个元素,若要根据用户输入的编码匹配id_error,可修改查找逻辑:
def check_data_login(self): test = self.input_code_out.text.strip() file_name = 'test.json' with open(file_name, 'r', encoding='utf-8') as f: data = json.loads(f.read()) # 遍历匹配输入的id_error for item in data: if item["id_error"] == test: self.vod_text = item["prich_error"] break else: # 无匹配时的提示 self.vod_text = "未找到对应数据"
修改后的完整main.py代码
from kivy.lang import Builder from kivymd.app import MDApp from kivy.uix.screenmanager import Screen, ScreenManager from kivy.properties import StringProperty, ObjectProperty import json class Lce_InputScreen(Screen): input_code_out = ObjectProperty(None) vod_text = StringProperty('') def check_data_login(self): test = self.input_code_out.text.strip() file_name = 'test.json' with open(file_name, 'r', encoding='utf-8') as f: data = json.loads(f.read()) # 固定取第一个元素(或使用上面的匹配逻辑) taxi = data[0]["prich_error"] self.vod_text = taxi print("texa", type(taxi), taxi) print(type(self.vod_text), self.vod_text) class ScreenManagement(ScreenManager): pass class CustomMenuApp(MDApp): def build(self): return Builder.load_file("copymain.kv") if __name__ == "__main__": CustomMenuApp().run()
验证效果
修改后点击Find按钮,vod_text属性会被正确更新,Kv文件中的MDLabel和MDTextField的hint_text会同步显示JSON中的对应值。
内容的提问来源于stack exchange,提问作者Dimka
相关产品推荐
相关产品推荐

