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

Kivy自定义MyScreenManager类调用self.parent返回None问题求助

问题原因

你在MyScreenManager的__init__方法中调用add_note时,MyScreenManager实例本身还没有被添加到父组件MDNavigationLayout中。Kivy的组件加载逻辑是先实例化子组件,再将子组件挂载到父组件,所以__init__执行阶段self.parent必然是None。

解决方法

方法1:使用Clock.schedule_once推迟初始化操作

把加笔记的逻辑推迟到组件树构建完成后执行,这时候MyScreenManager已经被挂载到父组件上,parent属性就有正确值了。
修改后的Python代码如下:

from kivy.clock import Clock

class MyScreenManager(ScreenManager):
    def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)
        # 推迟到下一帧执行初始化,保证组件树已构建完成
        Clock.schedule_once(self.init_notes, 0)
    
    def init_notes(self, dt):
        # 原来的数据库读取逻辑可以放到这里
        '''conn = sqlite3.connect('first_db.db')
        c = conn.cursor()
        c.execute("SELECT name FROM sqlite_master WHERE type='table';")
        screens = c.fetchall()
        for i in range(len(screens)):
            self.add_note()
        c.close()'''
        self.add_note()
    
    def add_note(self, name = ""):
        self.add_widget(NoteScreen(name = name))
        print(self.parent)

方法2:重写on_parent方法

当组件的parent属性被赋值时,on_parent方法会自动触发,你可以在这个时候执行初始化逻辑:

class MyScreenManager(ScreenManager):
    def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)
        
    def on_parent(self, instance, parent):
        # 只有当parent被正确赋值的时候才执行初始化,避免重复触发
        if parent is not None:
            # 原来的数据库读取逻辑和add_note调用放到这里
            '''conn = sqlite3.connect('first_db.db')
            c = conn.cursor()
            c.execute("SELECT name FROM sqlite_master WHERE type='table';")
            screens = c.fetchall()
            for i in range(len(screens)):
                self.add_note()
            c.close()'''
            self.add_note()
    
    def add_note(self, name = ""):
        self.add_widget(NoteScreen(name = name))
        print(self.parent)

内容的提问来源于stack exchange,提问作者Bach Tran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:15:03