You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:24:30