检索根 ID 给出空字典

Retrieving root ids gives empty dictionary

代码说明: 我有两个用于 ScreenList 对象的 ID(proof_list 和 menu_list)。当我点击一个列表项 (instance_item) 时,我想要他们关联的父项的 ID。 check_id 函数应通过调用 get_id(instance_item.parent) 来打印其父级的 id 来完成此操作,该 id 可以是 proof_list 或 menu_list.

问题: get_id 没有检索到 self.root.ids 完整词典。我通过打印结果进行了检查,它给出了一个空字典。出于好奇,我尝试在我的 on_start 方法中打印 self.root.ids,它给出了一个完整的 id 字典。我需要访问 get_id 中的 self.root.ids,因此它可以检查一个实例是否在该 id 字典中,如果为真,return 它的 id。

问题: 我相信这是一个初始化问题,但我不知道从哪里开始解决这个问题。所以我的问题是:

  1. 为什么在on_start方法中给出了完整的字典?
  2. 我的 get_id 方法如何像 on_start 方法一样检索完整的 id 字典?

我知道我的问题与初始化有关。但是,我仍在学习并且不知道该怎么做,因此非常感谢您的帮助。

这是一个非常简化的代码示例。

from kivymd.app import MDApp
from kivymd.theming import ThemableBehavior
from kivy.lang import Builder
from kivymd.uix.list import MDList, OneLineListItem, TwoLineListItem, ThreeLineListItem, ThreeLineIconListItem, \
            OneLineIconListItem
from kivy.core.window import Window
from proof_nav import proof_helper
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty
        
class ScreenList(ThemableBehavior, MDList):
    screen_manager = ObjectProperty()

    def check_id(self, instance_item):
        e1 = ProofApp()
        parent_id = e1.get_id(instance_item.parent)
        print(parent_id)

class ProofApp(MDApp):

    def build(self):
        screen = Builder.load_string(proof_helper)
        return screen

    def on_start(self):
        print(self.root.ids)

    def get_id(self, instance_item):
        for id, widget in self.root.ids.items():
            if instance_item == widget:
                print(self.root.ids)
                return str(id)
        print(self.root.ids)
        return ""




ProofApp().run()

这是我加载的字符串文件:

proof_helper = """
            
Screen:
    MDNavigationLayout:
        ScreenManager:
            id: screen_manager
                                
            Screen:
                name: 'menu'
                BoxLayout:
                    orientation: 'vertical'
                    MDToolbar:
                        title: "Menu Screen"
                        elevation: 8
                    
                    ScrollView:
                        ScreenList:
                            id: menu_list
                            screen_manager:screen_manager
                            OneLineListItem:
                                text: "Some Item"
                                on_release: self.parent.check_id(self)
                        
            
            Screen:
                name: 'screen2'
                BoxLayout:
                    orientation: 'vertical'
                    MDToolbar:
                        title: "Proofs"
                        elevation: 8

                    ScrollView:
                        ScreenList:
                            id: proof_list
                            screen_manager:screen_manager
                            OneLineListItem:
                                text: "Another Item"
                                on_release: self.parent.check_id(self)

"""

问题是在您的 check_id() 方法中,代码:

e1 = ProofApp()

正在创建 ProofApp 的新实例。 ProofApp 的新实例与您 运行 的实例无关。您必须使用 App 的当前 运行 实例,您可以通过调用 MDApp.get_running_app() 获得它。所以,你的 check_id() 方法应该是这样的:

def check_id(self, instance_item):
    # e1 = ProofApp()
    e1 = MDApp.get_running_app()
    parent_id = e1.get_id(instance_item.parent)
    print(parent_id)