Kivy中函数内self.add_widget不生效问题求助
解决Kivy中self.add_widget不生效的问题
核心原因:实例不匹配
你在TrainingApp.build()中手动创建了self.fav_training_content = FavouriteTrainingsContent()这个实例,但它从未被添加到界面的Widget树中。界面上实际显示的是kv语言在<FavouriteTrainings>内部自动生成的FavouriteTrainingsContent实例(对应id为fav_tr_content)。你调用refresh的是一个"游离"的实例,自然看不到控件被添加到界面。
修复步骤
1. 删除App中多余的实例创建
修改.py文件的TrainingApp.build()方法,去掉手动创建的无用实例:
class TrainingApp(MDApp): def build(self): sm = ScreenManager() sm.add_widget(MainWindow(name="mainwindow")) sm.add_widget(TrainingPlans(name="trainingplans")) sm.add_widget(SingleTrainingPlan(name="singletrainingplan")) sm.add_widget(FavouriteTrainings(name="favouritetrainings")) sm.add_widget(NavigationDrawer(name="navigationdrawer")) sm.add_widget(CurrentStats(name="currentstats")) # 删除以下两行无用的实例创建代码 # self.favouritetrainings = FavouriteTrainings() # self.fav_training_content = FavouriteTrainingsContent() return sm
2. 调用界面上的真实实例
修改导航抽屉的kv代码,直接获取屏幕中已存在的FavouriteTrainingsContent实例来执行refresh:
<ContentNavDrawer> ScrollView: MDList: # ...其他列表项保持不变... OneLineListItem: text: "Favourites" on_release: app.root.current = "favouritetrainings" app.do_cool_stuff() # 替换为获取界面真实实例的代码 app.root.get_screen("favouritetrainings").ids.fav_tr_content.refresh() root.nav_drawer.set_state("close") # ...其他列表项保持不变...
3. 优化refresh方法(可选)
每次调用refresh时建议先清空现有控件,避免重复添加元素:
class FavouriteTrainingsContent(GridLayout): def __init__(self, **kwargs): super(FavouriteTrainingsContent, self).__init__(**kwargs) def refresh(self): print("i am in favourite trainings refresh") print("Favorite Plans:", main.FavouriteTrainings.fav_plans) # 先清空已有控件,防止重复添加 self.clear_widgets() bn = Button(text="Hello") self.add_widget(bn) for plan in main.FavouriteTrainings.fav_plans: print(plan) lbl = Label( size_hint=(.7, 1), text="Training " + str(plan) ) btn = Button( size_hint=(.3, 1), background_normal="training_programs/Unknown-" + str(plan) + ".jpeg" ) self.add_widget(lbl) self.add_widget(btn)
内容的提问来源于stack exchange,提问作者user18315433
相关产品推荐
相关产品推荐

