【问题标题】:How to fix AttributeError: 'NoneType' object has no attribute 'theme_cls'如何修复 AttributeError:“NoneType”对象没有属性“theme_cls”
【发布时间】:2019-04-13 18:06:54
【问题描述】:

我正在尝试 Kivymd,但不断收到错误消息:AttributeError: 'NoneType' object has no attribute 'theme_cls'。

我在 App 类中添加了 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()

【问题讨论】:

  • 你用的是什么版本的python和kivymd?

标签: python kivy


【解决方案1】:

根本原因

当 Kivy 处理 kv 文件/字符串时,它在实例化 theme_cls 之前实例化了 根规则,MyScreenManager:。当MyScreenManager: 被实例化时,它会实例化它的孩子Screen:。当Screen: 被实例化时,它会实例化其子代Toolbar:,它引用theme_cls。但theme_cls 尚未实例化。因此,它抛出了以下错误,

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

AttributeError: 'NoneType' 对象没有属性 'theme_cls'

解决方案

kv 字符串

  • 将根规则MyScreenManager: 替换为类规则&lt;MyScreenManager&gt;:

片段

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

输出

【讨论】:

  • 嗨 ikolim,在 MyApp 类中添加 theme_cls = ThemeManager() 后,我还意识到每个屏幕的背景都变白了。有什么办法可以解决这个问题?想和以前一样。
  • 使用app.theme_cls.theme_style = 'Dark' 将背景颜色设置为黑色。有效选项为Dark 或Light。默认为Light。您可以在on_pre_enter 活动中更改主题样式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多