首页 > 解决方案 > AttributeError:“kivy.properties.DictProperty”对象没有属性“字段”?

问题描述

我收到此错误:“ 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()

标签: kivykivy-languagekivymd

解决方案


您可以通过消除您的__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

推荐阅读