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
相关产品推荐
相关产品推荐

