0
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.menu import MDDropdownMenu


class MainWindow(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.menu = MDDropdownMenu(
        caller=self.drop,
        callback=self.drop_down,
        width_mult=4,
        items=self.menu_items
    )

@staticmethod
def drop_down(instance):
    print(instance.text)


class WindowManager(ScreenManager):
    pass


class MyApp(MDApp):
    def build(self):
        return WindowManager()


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



my.kv

<WindowManager>:
    MainWindow:


<MainWindow>:
    drop:drop
    Button:
        id: drop
        pos_hint : {'center_x': .5 , 'center_y':.5}
        on_release: root.menu.open()

我试图将按钮与在 MainWindow 类中实例化的 DropDown 绑定,它工作正常,而我没有使用屏幕管理器作为根,但现在它不能正常运行。这是我运行程序时出现的错误。

AttributeError:“MainWindow”对象没有属性“drop”

提前致谢!

4

1 回答 1

1

发生错误是因为在执行规则之前没有创建drop属性,这发生在方法运行之后。所以你不能在方法中使用。避免该错误的一种方法是延迟访问. 这是执行此操作的代码的修改版本:MainWindowkv__init__()ids__init__()idsClock.schedule_once()

from kivy.clock import Clock
from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.menu import MDDropdownMenu


class MainWindow(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_once(self.setup)

    def setup(self, *args):
        self.menu_items = [ {'text':'abba'}, {'text':'dabba'}, {'text':'doo'}]
        self.menu = MDDropdownMenu(
        caller=self.drop,
        callback=self.drop_down,
        width_mult=4,
        items=self.menu_items)

    @staticmethod
    def drop_down(instance):
        print(instance.text)


class WindowManager(ScreenManager):
    pass


class MyApp(MDApp):
    def build(self):
        return WindowManager()

if __name__ == '__main__':
    MyApp().run()
于 2020-07-29T19:59:12.077 回答