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

时间:2019-02-23 06:22:46

标签: python-3.x kivy kivy-language

我想单击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并获取文本吗?

2 个答案:

答案 0 :(得分:0)

AttributeError

  

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

该错误归因于类MDMenuItem的错误定义。它是通过Widget的继承定义的,该Widget没有属性'text'。

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()

解决方案

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

示例

main.py

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)

输出

KivyMD MDDropdownMenu

答案 1 :(得分: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)

.kv

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