Kivy实现点击按钮刷新重建ReviewLayout部件的方法
问题原因
你之前调用的ask_update()仅触发Kivy画布的重绘逻辑,不会修改已有的部件树结构,自然无法实现动态增减标签、按钮的效果,要达到和重启应用一致的页面效果,需要完全销毁旧的ReviewLayout实例,新建实例后插回原父容器的对应位置。
实现步骤
- 避免使用多层
parent链式访问部件,优先通过ids属性定位目标,防止布局调整后访问路径失效。 - 在按钮所属的父类(通常是对应Screen类)中新增刷新方法,示例代码如下:
def refresh_review_layout(self, instance): # 获取旧的ReviewLayout实例和它的父容器 old_rev = self.ids.rev parent_container = old_rev.parent # 移除旧实例 parent_container.remove_widget(old_rev) # 新建ReviewLayout实例,自动执行__init__中的初始化构建逻辑 # 如果初始化需要传入最新数据,此处传入对应参数即可 new_rev = ReviewLayout() new_rev.id = "rev" # 将新实例插入原位置,更新ids映射 parent_container.add_widget(new_rev) self.ids["rev"] = new_rev
- 给按钮绑定上述刷新方法即可:
self.but1.bind(on_press = self.refresh_review_layout)
注意事项
- 如果
ReviewLayout的__init__方法依赖外部数据源,新建实例时请传入最新的数据源参数,保证重建后显示的是最新内容。 - 如果
rev的id定义在App根布局中,替换访问路径为App.get_running_app().root.ids.rev即可。
内容的提问来源于stack exchange,提问作者ChrisCross
相关产品推荐
相关产品推荐

