Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MDDropdownMenu调用程序上的KivyMD键错误_Python_Python 3.x_Kivy_Keyerror_Kivymd - Fatal编程技术网

Python MDDropdownMenu调用程序上的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方法位于我的根类

我正试图改变我现有的Kivy应用程序,以合并美观的KivyMD小部件。我删除了
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
调用)。