如何将用户输入的图片路径存入JSON并在Kivy应用中实现动态切换?
问题排查与解决方案
1. 思路可行性判断
你的整体思路是正确的,通过JsonStore持久化存储路径、读取后动态修改图片source属性的逻辑没问题,功能无法实现是因为存在两个代码错误和认知偏差:
- 认知偏差:JSON语法要求字符串中的反斜杠必须转义,你看到的存储结果中
E:\\xxx是正常的转义格式,JsonStore读取时会自动还原为E:\xxx,不需要修改存储格式 - 错误1:输入路径没有做清理,你存储结果中路径首尾多余的双引号,是用户输入时不小心带了引号导致的,没有做过滤
- 错误2:
pic_changer方法中字符串格式化没有加f前缀,导致直接把模板字符串赋值给了source属性,根本没有获取到真实路径
2. 修正后可直接运行的代码
修改点说明:
- 增加输入路径清理逻辑,自动去除首尾空白、多余的单双引号
- 修正f-string格式化错误
- 增加路径有效性校验,避免无效路径报错
- 优化异常容错逻辑
from kivy.lang.builder import Builder from kivy.uix.screenmanager import Screen from kivymd.app import MDApp from kivy.storage.jsonstore import JsonStore import os screen_helper = """ ScreenManager: Studio: EditCover: <Studio>: name : 'studio' MDFloatLayout: FitImage: id: cover_pic orientation: "vertical" size_hint: 1, .75 pos_hint: {"center_x": .5, "center_y": 1} source: "Photos/3.jpg" <EditCover>: name : 'edit_cover' MDTextField: id : cover_path hint_text: "Path" mode: "rectangle" pos_hint: {'center_x':0.5,'center_y':0.5} size_hint: (0.68,0.07) MDRaisedButton: text : 'OK' pos_hint : {'center_x':0.9,'center_y':0.08} font_style: 'Button' ripple_rad_default : 40 ripple_duration_out : 1 md_bg_color: app.theme_cls.primary_dark on_press : app.save_pic_path() """ class EditCover(Screen): pass class Studio(Screen): pass class Mode(MDApp): def build(self): return Builder.load_string(screen_helper) def save_pic_path(self): # 清理输入路径:去除首尾空白、多余的单双引号 raw_path = self.root.get_screen('edit_cover').ids.cover_path.text.strip() self.cover_path = raw_path.strip('\'"') # 校验路径是否存在 if os.path.exists(self.cover_path): self.store_paths.put('PathInfo', cover_path = self.cover_path) self.pic_changer() else: # 可自行添加无效路径提示逻辑,这里默认使用默认图 self.root.get_screen('studio').ids.cover_pic.source = "Photos/3.jpg" def pic_changer(self): # 修正f-string格式化错误 self.root.get_screen('studio').ids.cover_pic.source = f"{self.store_paths.get('PathInfo')['cover_path']}" def on_start(self): self.store_paths = JsonStore("paths.json") try: saved_path = self.store_paths.get('PathInfo')['cover_path'] if saved_path and os.path.exists(saved_path): self.pic_changer() else: self.root.get_screen('studio').ids.cover_pic.source = "Photos/3.jpg" except KeyError: self.root.get_screen('studio').ids.cover_pic.source = "Photos/3.jpg" Mode().run()
3. 更优方案建议
如果不需要跨设备同步路径,可直接使用系统文件选择器让用户选择图片,替代手动输入路径,避免输入错误,KivyMD自带MDFileManager组件可直接调用,不需要用户手动输入路径,容错率更高。
内容的提问来源于stack exchange,提问作者Kusal Darshana
相关产品推荐
相关产品推荐

