如何读取.kv文件自定义类内组件文本值到.py文件函数中
问题核心原因
你原有代码的问题在于:在create_recipe方法里新实例化的AddIngToRecipe是完全独立的新对象,和你之前添加到界面里的实例没有任何关联;同时ingredientforRecipe是存放所有AddIngToRecipe实例的GridLayout容器,不能直接通过它的ids查找子控件内部的qtyRe。
解决方法
第一步:完善AddIngToRecipe类的取值方法
修改main.py里的AddIngToRecipe类,新增方法直接返回当前实例的三个目标值:
class AddIngToRecipe(FakeRectangularElevationBehavior, FloatLayout, TouchBehavior): names = ObjectProperty() unit = ObjectProperty() # 新增取值方法 def get_ingredient_info(self): return { "name": str(self.names), "unit": str(self.unit), "quantity": self.ids.qtyRe.text.strip() }
第二步:遍历容器读取所有动态添加的食材信息
你添加到界面里的所有AddIngToRecipe实例,都存放在createRecipe屏幕的ingredientforRecipe容器的children属性中,遍历即可读取所有实例的数值,修改PieceofCake类的create_recipe方法:
class PieceofCake(MDApp, Screen): def create_recipe(self, Renames, Recomment): # 先拿到createRecipe屏幕的食材容器 create_recipe_screen = self.root.get_screen('createRecipe') ingredient_container = create_recipe_screen.ingredientforRecipe all_ingredients = [] # 遍历容器内所有AddIngToRecipe实例,如果需要按添加顺序读取,加reversed反转children for ing_widget in reversed(ingredient_container.children): if isinstance(ing_widget, AddIngToRecipe): ing_info = ing_widget.get_ingredient_info() all_ingredients.append(ing_info) # 测试打印单条食材信息 print(f"食材名:{ing_info['name']},单位:{ing_info['unit']},数量:{ing_info['quantity']}") # 后续自定义处理逻辑 print(Renames) print(Recomment)
可选优化方案
如果不想每次都遍历容器,也可以在添加实例的时候把实例存到App类的全局列表里,后续直接读取列表即可:
# 在App初始化时新增存储列表 self.added_ing_list = [] # 调用add_widget的地方修改为: new_ing = AddIngToRecipe(names=names, unit=unit) self.added_ing_list.append(new_ing) screen_manager.get_screen('createRecipe').ingredientforRecipe.add_widget(new_ing)
内容的提问来源于stack exchange,提问作者Denis Savishchev
相关产品推荐
相关产品推荐

