AttributeError: 'kivy.properties.DictProperty' object has no attribute 'field'?

AttributeError: 'kivy.properties.DictProperty' object has no attribute 'field'?

我收到此错误:“AttributeError:'kivy.properties.DictProperty' 对象没有属性 'field'”

我正在尝试使用 kivymd 创建下拉菜单。 在我的 .kv 文件中,我有这个“id: field”,它一直对我说“对象没有属性 'field'”

欢迎任何帮助!

这是我的 .kv 文件:

<Box>:
    MDTextField:
        id: field
        pos_hint: {'center_x': .5, 'center_y': .5}
        size_hint_x: None
        width: "200dp"
        hint_text: "Password"
        on_focus: if self.focus: app.menu.open()

这是我的 .py 文件:

from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu


class Box(BoxLayout):
    pass


class Projeto(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.screen = Box
        menu_items = [{"icon": "git", "text": f"Item {i}"} for i in range(5)]
        self.menu = MDDropdownMenu(
            caller=self.screen.ids.field,
            items=menu_items,
            position="bottom",
            width_mult=4,
        )
        self.menu.bind(on_release=self.set_item)

    def set_item(self, instance_menu, instance_menu_item):
        def set_item(interval):
            self.screen.ids.field.text = instance_menu_item.text
            instance_menu.dismiss()

        Clock.schedule_once(set_item, 0.5)

    def build(self):
        return Box()


if __name__ == '__main__':
    Projeto().run()

您可以通过删除 __init__() 方法并将部分代码移至 build() 方法来修复该错误:

class Projeto(MDApp):

    def set_item(self, instance_menu_item):
        def set_item(interval):
            self.screen.ids.field.text = instance_menu_item.text
            self.menu.dismiss()

        Clock.schedule_once(set_item, 0.5)

    def build(self):
        self.screen = Box()
        menu_items = [{"icon": "git", "text": f"Item {i}"} for i in range(5)]
        self.menu = MDDropdownMenu(
            caller=self.screen.ids.field,
            callback=self.set_item,
            items=menu_items,
            position="bottom",
            width_mult=4,
        )
        # self.menu.bind(on_release=self.set_item)  # use callback instead of bind
        return self.screen