KivyMD'MDMenuItem'对象没有属性'text'

问题描述 投票:1回答:2

我想单击MDMenuItem来获取文本或执行某些操作。但是错误说“AttributeError:'MDMenuItem'对象没有属性'text'”

像这样的.py文件

class MDMenuItem(Widget):
    pass

class MyScreen(Screen):
    menu_items = [
    {'viewclass': 'MDMenuItem',
     'text': 'text1'},
    {'viewclass': 'MDMenuItem',
     'text': 'text2'},
    ]

    def change_variable(self, value):
        print("\nvalue=", value)
        self.VARIABLE = value
        print("\tself.VARIABLE=", self.VARIABLE)

.kv文件是这样的:

#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
#:import MDRaisedButton kivymd.button.MDRaisedButton
<MDMenuItem>:
    on_release: root.change_variable(self.text)

<MyScreen>:
    name: myscrn
    MDRaisedButton:
        size_hint: None, None
        size: 3 * dp(48), dp(48)
        text: 'MDButton'
        opposite_colors: True
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
        on_release: MDDropdownMenu(items=root.menu_items, width_mult=4).open(self) 

我该怎么办?

编辑:谢谢你的回复。在我的例子中,这个.py子程序不包含'App'。我不想把这个方法放到main.py中,因为我希望main.py保持干净。(只是内容导入,builder.load_file,add_wiget ......)

所以我想在不使用'app.something'的情况下调用方法。我可以使用root.something或其他方法来调用change_variable并获取文本吗?

python-3.x kivy kivy-language
2个回答
0
投票

我删除了类MDMenuItem并将“root.change_variable”更改为“app.root.get_screen('MyScreen')。change_variable”。这是工作!!!在这种情况下,“app.root”被视为“screen.manager”。我不知道为什么,但它只是工作。

的.py

class MyScreen(Screen):

    menu_items = [
        {'viewclass': 'MDMenuItem',
        'text': 'text1'},
        {'viewclass': 'MDMenuItem',
        'text': 'text2'},
    ]

    def change_variable(self, value):
        print("\nvalue=", value)
        self.VARIABLE = value
        print("\tself.VARIABLE=", self.VARIABLE)

平方米

#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
#:import MDRaisedButton kivymd.button.MDRaisedButton
<MDMenuItem>:
    on_release: app.root.get_screen("MyScreen").change_variable(self.text)

0
投票

Note:

以下解决方案是使用KivyMD version 0.1.2

AttributeError

AttributeError:'MDMenuItem'对象没有属性'text'

该错误是由于类MDMenuItem的错误定义。它是使用Widget的继承定义的,该Widget没有属性“text”。

Actual Definition of MDMenuItem

from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.button import ButtonBehavior
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty


class MDMenuItem(RecycleDataViewBehavior, ButtonBehavior, BoxLayout):
    text = StringProperty()

Solution

无需在main.py中定义类MDMenuItem。删除它,程序将运行。

Example

卖弄.朋友

from kivy.app import App
from kivymd.theming import ThemeManager
from kivy.uix.screenmanager import Screen


class MyScreen(Screen):
    VARIABLE = ""

    menu_items = [
    {'viewclass': 'MDMenuItem',
     'text': 'text1'},
    {'viewclass': 'MDMenuItem',
     'text': 'text2'},
    ]

    def change_variable(self, value):
        print("\nvalue=", value)
        self.VARIABLE = value
        print("\tself.VARIABLE=", self.VARIABLE)


class MainApp(App):
    title = "KivyMD MDDropdownMenu Demo"
    theme_cls = ThemeManager()

    def build(self):
        return MyScreen()


if __name__ == "__main__":
    MainApp().run()

main.kv

#:kivy 1.11.0
#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
#:import MDRaisedButton kivymd.button.MDRaisedButton

<MDMenuItem>:
    on_release: app.root.change_variable(self.text)

<MyScreen>:
    name: 'myscrn'
    MDRaisedButton:
        size_hint: None, None
        size: 3 * dp(48), dp(48)
        text: 'MDButton'
        opposite_colors: True
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
        on_release: MDDropdownMenu(items=root.menu_items, width_mult=4).open(self)

Output

KivyMD MDDropdownMenu

© www.soinside.com 2019 - 2024. All rights reserved.