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