检索根 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。
问题:
我相信这是一个初始化问题,但我不知道从哪里开始解决这个问题。所以我的问题是:
- 为什么在on_start方法中给出了完整的字典?
- 我的 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)
代码说明: 我有两个用于 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。
问题: 我相信这是一个初始化问题,但我不知道从哪里开始解决这个问题。所以我的问题是:
- 为什么在on_start方法中给出了完整的字典?
- 我的 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)