Python MDDropdownMenu调用程序上的KivyMD键错误
我正试图改变我现有的Kivy应用程序,以合并美观的KivyMD小部件。我删除了Python MDDropdownMenu调用程序上的KivyMD键错误,python,python-3.x,kivy,keyerror,kivymd,Python,Python 3.x,Kivy,Keyerror,Kivymd,我正试图改变我现有的Kivy应用程序,以合并美观的KivyMD小部件。我删除了mdraised按钮的微调器,该按钮在发布时带有调用者,用于mddropdown菜单,该菜单包含通过蓝牙与设备配对的设备名称列表(取决于平台)。对于这个测试示例,我只使用MDDropdownMenudocs示例中所示的菜单项列表 由于某种原因,我在初始化mddropdownlmenu属性时收到MDRaisedButtonid的keyrerror:“dev_button”。\uuuu init\uuuuu方法位于我的根类
mdraised按钮的微调器
,该按钮在发布时带有调用者
,用于mddropdown菜单
,该菜单包含通过蓝牙与设备配对的设备名称列表(取决于平台)。对于这个测试示例,我只使用MDDropdownMenu
docs示例中所示的菜单项列表
由于某种原因,我在初始化mddropdownlmenu
属性时收到MDRaisedButton
id
的keyrerror:“dev_button”
。\uuuu init\uuuuu
方法位于我的根类中,该根类位于名为indexui.py
和indexui.kv
的单独文件中,与main.py
和main.kv
文件相连。但是在main.py
文件中导入,并包含在main.kv
文件中。在更改微调器之前,应用程序确实运行过
indexui.py
class RootLay(FloatLayout):
this = ObjectProperty(None) # App object
bserial = ObjectProperty(None) # Bluetooth variables starts
recv_stream = ObjectProperty(None)
send_stream = ObjectProperty(None)
menu = ObjectProperty(None)
rfsocket = ObjectProperty(None)
device = ObjectProperty(None)
pattern = ObjectProperty(None)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.device = None
self.pattern = re.compile(r'[GNSTUkg,\s]')
self.dev_list = []
menu_items = [{"icon": "git", "text": f"Item {i}"} for i in range(5)]
print(dir(self.ids))
self.menu = MDDropdownMenu(
caller=self.ids.dev_button, items=menu_items, width_mult=4
)
self.menu.bind(on_release=self.menu_callback)
from kivymd.app import MDApp
from views.indexui import RootLay
from kivy.properties import ObjectProperty
class MainApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Yellow" # "Purple", "Red"
self.theme_cls.primary_hue = "600"
# self.icon = 'bluetooth-connected_326502.png'
root = ObjectProperty(RootLay())
return root
def on_pause(self):
return True
MainApp().run()
indexui.kv
<RootLay>:
MDToolbar:
pos_hint: {'top': 1, 'right': 1}
title: "Bluetooth Weigh"
MDRaisedButton:
id: dev_button
text: "SEE DEVICES"
pos_hint: {'top': 0.76, 'right': 0.9}
on_release: app.root.menu.open()
#:include views/indexui.kv
RootLay:
main.kv
<RootLay>:
MDToolbar:
pos_hint: {'top': 1, 'right': 1}
title: "Bluetooth Weigh"
MDRaisedButton:
id: dev_button
text: "SEE DEVICES"
pos_hint: {'top': 0.76, 'right': 0.9}
on_release: app.root.menu.open()
#:include views/indexui.kv
RootLay:
有人能帮我理解为什么会出现keyrerror
?MDRaisedButton
作为一种方法位于RootLay
类范围内。因此,我应该能够访问其所有属性。我认为问题在于,您试图在RootLay
类的id
可用之前访问它们。我建议通过使用Clock.schedule\u once()
这样延迟访问:
class RootLay(FloatLayout):
this = ObjectProperty(None) # App object
bserial = ObjectProperty(None) # Bluetooth variables starts
recv_stream = ObjectProperty(None)
send_stream = ObjectProperty(None)
menu = ObjectProperty(None)
rfsocket = ObjectProperty(None)
device = ObjectProperty(None)
pattern = ObjectProperty(None)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.device = None
self.pattern = re.compile(r'[GNSTUkg,\s]')
self.dev_list = []
Clock.schedule_once(self.setup_menu) # delay until ids are available
def setup_menu(self, dt):
menu_items = [{"icon": "git", "text": f"Item {i}"} for i in range(5)]
self.menu = MDDropdownMenu(
caller=self.ids.dev_button,
items=menu_items,
width_mult=4
)
self.menu.bind(on_release=self.menu_callback)
您的kv
似乎未加载。您是否明确加载了kv
?您的kv
文件名为main.kv
?您好,谢谢您的回复。是的,我相信它正在加载,因为main.kv
文件与App类同名。我在上面添加了kv
文件代码。有什么我需要额外做的吗?或者我没有正确导入的东西?这是一个非常聪明的解决方案。谢谢如果您将回调函数添加到菜单项
中,并且没有像我的示例中那样绑定它,那么它是否会影响函数的工作?即菜单项=[{'callback':self.menu_callback,'text':f“Item{i}}”,表示范围(5)}内的i]
而不是将其绑定到self.menu
。我之所以这样问,是因为Erik Sandberg以这种方式使用了回调
,但当回调
和视图类
设置为项
键时,它不起作用。它仅在设置为mddropdownlmenu
实例上的callback
键时工作。在mddropdown菜单
源代码中,我也找不到可以在mddropdown菜单
实例的项
键上设置的viewclass
或回调
。因此,可能它已经被弃用了,我不知道有什么方法可以在项
列表中包含回调,但是,您可以将callback=self.menu\u callback
添加到MDDropdownMenu()
调用中(并删除self.menu.bind
调用)。