Как исправить AttributeError: у объекта 'NoneType' нет атрибута 'theme_cls' - PullRequest
0 голосов
/ 13 апреля 2019

Я пробую Kivymd, но получаю сообщение об ошибке: AttributeError: у объекта 'NoneType' нет атрибута 'theme_cls'.

Я добавил theme_cls = ThemeManager () в классе приложения, но все еще получаю сообщение об ошибке.Пожалуйста, помогите, поскольку в сети больше нет решений.

from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition, WipeTransition

from kivy.app import App
from kivy.uix.button import Button
from kivymd.navigationdrawer import MDNavigationDrawer
from kivymd.theming import ThemeManager

class BeginScreen(Screen):
    pass

class MyScreenManager(ScreenManager):
    pass

Login = Builder.load_string('''
#: import Toolbar kivymd.toolbar.Toolbar


MyScreenManager:
    Screen:


<Screen>:

    Toolbar:
        title: "Simple toolbar"
        pos_hint: {'center_x': 0.5, 'center_y': 0.75}
        md_bg_color: get_color_from_hex(colors['Teal']['500'])
        background_palette: 'Teal'
        background_hue: '500'
    Toolbar:
        title: "Toolbar with right buttons"
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
        md_bg_color: get_color_from_hex(colors['Amber']['700'])
        background_palette: 'Amber'
        background_hue: '700'
        right_action_items: [['content-copy', lambda x: None]]
    Toolbar:
        title: "Toolbar with left and right buttons"
        pos_hint: {'center_x': 0.5, 'center_y': 0.25}
        md_bg_color: get_color_from_hex(colors['DeepPurple']['A400'])
        background_palette: 'DeepPurple'
        background_hue: 'A400'
        left_action_items: [['arrow-left', lambda x: None]]
        right_action_items: [['lock', lambda x: None], \
            ['camera', lambda x: None], \
            ['play', lambda x: None]]


''')

class MyApp(App):
    theme_cls = ThemeManager()

    def build(self):
        return Login

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

1 Ответ

1 голос
/ 13 апреля 2019

Основная причина

Когда Kivy обрабатывает файл / строку kv, он создает корневое правило , MyScreenManager: до создания theme_cls.Когда создается экземпляр MyScreenManager:, он создает экземпляр своего потомка Screen:.Когда создается экземпляр Screen:, он создает свои дочерние элементы Toolbar:, которые ссылаются на theme_cls.Но theme_cls еще не создан.Поэтому он выдал следующую ошибку:

 self._shadow = App.get_running_app().theme_cls.quad_shadow

AttributeError: у объекта 'NoneType' нет атрибута 'theme_cls'

Solution

kv string

  • Заменить корневое правило, MyScreenManager: на правило класса, <MyScreenManager>:

Фрагменты

Login = Builder.load_string('''
#:import Toolbar kivymd.toolbar.Toolbar


<MyScreenManager>:
    Screen:

Скрипт Python

  • Заменить return Login на return MyScreenManager()

Фрагменты

class MyApp(App):
    theme_cls = ThemeManager()

    def build(self):
        return MyScreenManager()

Выход

Result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...