Объект KivyMD 'MDMenuItem' не имеет атрибута 'текст' - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу нажать MDMenuItem, чтобы получить текст или что-то сделать.Но появляется ошибка «AttributeError: у объекта 'MDMenuItem' нет атрибута 'text'"

.py

Что мне делать?

Редактировать: Спасибо за ваш ответ.В моем случае эта подпрограмма .py не является содержимым приложения.Я не хочу помещать метод в main.py, потому что я хочу, чтобы main.py оставался чистым (просто импорт контента, buildder.load_file, add_wiget ...)

Поэтому я хочу вызывать метод безиспользуйте app.something.Могу ли я использовать root.something или другие методы для вызова change_variable и получения текста?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я удалил класс 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)
0 голосов
/ 23 февраля 2019

Примечание:

Следующее решение использует KivyMD версия 0.1.2 .

AttributeError

AttributeError: у объекта 'MDMenuItem' нет атрибута 'text'

Ошибка из-за неправильного определения класса MDMenuItem.Он был определен с наследованием виджета, который не имеет атрибута «текст».

Фактическое определение 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()

Решение

Нет необходимостиопределить класс MDMenuItem в main.py.Удалите его и программа запустится.

Пример

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

...