首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:在_update_shadow self._shadow = App.get_running_app().theme_cls.quad_shadow中

错误:在_update_shadow self._shadow = App.get_running_app().theme_cls.quad_shadow中
EN

Stack Overflow用户
提问于 2019-07-20 22:38:45
回答 1查看 355关注 0票数 0

我正在Kivy和KivyMD中为登录函数构建一个图形用户界面。我的GUI在Kivy代码中运行良好,但是当我将Button更改为MDRaisedButton时,我得到了这两个错误(下面是完整的错误代码):

  1. AttributeError: NoneType对象没有属性“theme_cls”
  2. 第118行,在_update_shadow self._shadow = App.get_running_app().theme_cls.quad_shadow中

我很想知道是否还有人能找出这个问题,并向我解释。谢谢!

在过去的8个小时里,我将整个应用程序从一个空白页重建为一个新的页面,在编辑之间运行代码,以查看是否能够精确地指出它的破坏位置。不幸的是,我找不到解决这个问题的办法。

framedesign.py

代码语言:javascript
复制
class LoginWindow(Screen):
    email = ObjectProperty(None)
    password = ObjectProperty(None)

    def loginBtn(self):
        if db.validate(self.email.text, self.password.text):
            MainWindow.current = self.email.text
            self.reset()
            sm.current = "main"
        else:
            invalidLogin()

    def createBtn(self):
        self.reset()
        sm.current = "create"

    def reset(self):
        self.email.text = ""
        self.password.text = ""

class WindowManager(ScreenManager):
    pass

sm = WindowManager()

screens = [LoginWindow(name="login"), CreateAccountWindow(name="create"), MainWindow(name="main")]
for screen in screens:
    sm.add_widget(screen)

sm.current = "login"

class FrameWork(App):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = "DeepPurple"
    title = "Frame Work"

    def build(self):
        return sm

design.kv:

代码语言:javascript
复制
<WindowManager>:
    LoginWindow:
        name: "login"

        email: email
        password: password
        MDRaisedButton:
           pos_hint:{"x":0.2,"y":0.05}
           size_hint: 0.6, 0.2
           font_size: (root.width**2 + root.height**2) / 13**4
           text: "Login"
           on_release:
              root.manager.transition.direction = "up"
              root.loginBtn()
代码语言:javascript
复制
Traceback (most recent call last):
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 696, in _apply_rule
     setattr(widget_set, key, value)
   File "kivy\weakproxy.pyx", line 35, in kivy.weakproxy.WeakProxy.__setattr__
   File "kivy\properties.pyx", line 497, in kivy.properties.Property.__set__
   File "kivy\properties.pyx", line 544, in kivy.properties.Property.set
   File "kivy\properties.pyx", line 599, in kivy.properties.Property.dispatch
   File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
   File "kivy\properties.pyx", line 1318, in kivy.properties.ReferenceListProperty.trigger_change
   File "kivy\properties.pyx", line 1333, in kivy.properties.ReferenceListProperty.trigger_change
   File "kivy\properties.pyx", line 599, in kivy.properties.Property.dispatch
   File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivymd\elevation.py", line 118, in _update_shadow
     self._shadow = App.get_running_app().theme_cls.quad_shadow
 AttributeError: 'NoneType' object has no attribute 'theme_cls'

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "C:/Users/tsuyu/PycharmProjects/waverunners-ocr/venv/Scripts/framedesign.py", line 132, in <module>
     sm = WindowManager()
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\uix\screenmanager.py", line 968, in __init__
     super(ScreenManager, self).__init__(**kwargs)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\uix\floatlayout.py", line 65, in __init__
     super(FloatLayout, self).__init__(**kwargs)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\uix\layout.py", line 76, in __init__
     super(Layout, self).__init__(**kwargs)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\uix\widget.py", line 361, in __init__
     rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\uix\widget.py", line 469, in apply_class_lang_rules
     rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 538, in apply
     rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 659, in _apply_rule
     child, crule, rootrule, rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 659, in _apply_rule
     child, crule, rootrule, rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 657, in _apply_rule
     root=rctx['ids']['root'], rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\uix\widget.py", line 469, in apply_class_lang_rules
     rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 538, in apply
     rule_children=rule_children)
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 707, in _apply_rule
     e), cause=tb)
 kivy.lang.builder.BuilderException: Parser: File "<inline>", line 58:
 ...
      56:
      57:    lbl_txt: lbl_txt
 >>   58:    height: dp(36) if not root._height else root._height
      59:    width: lbl_txt.texture_size[0] + root.increment_width
      60:    padding: (dp(8), 0)
 ...
 AttributeError: 'NoneType' object has no attribute 'theme_cls'
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivy\lang\builder.py", line 696, in _apply_rule
     setattr(widget_set, key, value)
   File "kivy\weakproxy.pyx", line 35, in kivy.weakproxy.WeakProxy.__setattr__
   File "kivy\properties.pyx", line 497, in kivy.properties.Property.__set__
   File "kivy\properties.pyx", line 544, in kivy.properties.Property.set
   File "kivy\properties.pyx", line 599, in kivy.properties.Property.dispatch
   File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
   File "kivy\properties.pyx", line 1318, in kivy.properties.ReferenceListProperty.trigger_change
   File "kivy\properties.pyx", line 1333, in kivy.properties.ReferenceListProperty.trigger_change
   File "kivy\properties.pyx", line 599, in kivy.properties.Property.dispatch
   File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
   File "C:\Users\tsuyu\PycharmProjects\waverunners-ocr\venv\lib\site-packages\kivymd\elevation.py", line 118, in _update_shadow
     self._shadow = App.get_running_app().theme_cls.quad_shadow
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-22 17:18:27

问题的根源

问题在于在实例化theme_cls对象sm = WindowManager()时没有定义sm = WindowManager()

解决方案

解决方案是在实例化WindowManager()之后实例化theme_cls = ThemeManager()

py文件

  • return sm替换为returnWindowManager()‘
  • 删除以下代码行并在kv文件中实现add_widget() (又名实例化子) sm = WindowManager() screen = LoginWindow(name= "login“),CreateAccountWindow(name="create"),MainWindow(name="main")用于屏幕中的屏幕:sm.add_widget(屏幕) sm.current =”login“

片段- py文件

代码语言:javascript
复制
class WindowManager(ScreenManager):
    pass


class FrameWork(App):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = "DeepPurple"
    title = "Frame Work"

    def build(self):
        return WindowManager()

kv文件

  • 将屏幕(CreateAccountWindowMainWindow)实例化为类规则<WindowManager>:的子级

片段- kv文件

代码语言:javascript
复制
<WindowManager>:
    LoginWindow:
        name: "login"
    CreateAccountWindow:
        name: "create"
    MainWindow:
        name: "main"

示例

下面的示例是使用Kivy (ScreenManager、屏幕、标签、弹出、FloatLayout、GridLayout)和KivyMD (例如ThemeManager、MDLabel、MDTextField、MDRaisedButton、MDRectangleFlatButton)的应用程序的模拟。

main.py

代码语言:javascript
复制
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty

from kivymd.theming import ThemeManager

from database import DataBase as db

Builder.load_string("""
#:import MDLabel kivymd.label.MDLabel
#:import MDTextField kivymd.textfields.MDTextField
#:import MDRaisedButton kivymd.button.MDRaisedButton
#:import MDRectangleFlatButton kivymd.button.MDRectangleFlatButton

<WindowManager>:
    LoginWindow:
        name: "login"
    CreateAccountWindow:
        name: "create"
    MainWindow:
        name: "main"

<LoginWindow>:        

    namee: namee
    email: email
    password: passw
    bikebrand: bikebrand

    FloatLayout:

        FloatLayout:
            size: root.width, root.height/2

            MDLabel:
                text: "Create an Account"
                size_hint: 0.8, 0.2
                pos_hint: {"x":0.1, "top":1}
                font_size: (root.width**2 + root.height**2) / 14**4

            MDLabel:
                size_hint: 0.26,0.15
                pos_hint: {"x":0, "top":0.8}
                text: "Name: "
                font_size: (root.width**2 + root.height**2) / 14**4

            MDTextField:
                helper_text: "Name"
                helper_text_mode: "on_focus"
                pos_hint: {"x":0.3, "top":0.76}
                size_hint: 0.5, 0.08
                id: namee
                multiline: False
                font_size: (root.width**2 + root.height**2) / 14**4

            MDLabel:
                size_hint: 0.26,0.15
                pos_hint: {"x":0, "top":0.7}
                text: "Email: "
                font_size: (root.width**2 + root.height**2) / 14**4

            MDTextField:
                helper_text: "e.g. john.doe@gmail.com"
                helper_text_mode: "on_focus"
                pos_hint: {"x":0.3, "top":0.66}
                size_hint: 0.5, 0.08
                id: email
                multiline: False
                font_size: (root.width**2 + root.height**2) / 14**4

            MDLabel:
                size_hint: 0.2,0.15
                pos_hint: {"x":0, "top":0.6}
                text: "Password: "
                font_size: (root.width**2 + root.height**2) / 14**4

            MDTextField:            
                helper_text: "Must contain Symbols:( e.g. @#$% ), Numbers:( e.g. 123456 ), Lowercase Characters:( e.g. abcdefgh ) and Uppercase Characters:( e.g. ABCDEFGH )"
                helper_text_mode: "on_focus"
                pos_hint: {"x":0.3, "top":0.56}
                size_hint: 0.5, 0.08
                id: passw
                multiline: False
                password: True
                font_size: (root.width**2 + root.height**2) / 14**4

            MDLabel:
                size_hint: 0.26,0.15
                pos_hint: {"x":0, "top":0.5}
                text: "Bike: "
                font_size: (root.width**2 + root.height**2) / 14**4

            Spinner:
                id: bikebrand
                on_text:
                    print("kv: bikebrand.text={}".format(bikebrand.text))
                text: "<Select>"
                values: ['Brand A', 'Brand B', 'Brand C', 'Brand D', 'Brand E', 'Brand F', 'Brand G', 'Brand H', 'Brand I']
                # background_color: 1,1,1,1
                color: 0,0,0,1
                color_down: 0,0,0,1
                size_hint: 0.5, 0.08
                pos_hint: {"x":0.3, "top":0.46}

            MDRectangleFlatButton:
                pos_hint:{"x":0.3,"y":0.25}
                size_hint: 0.5, 0.1
                font_size: (root.width**2 + root.height**2) / 15**4
                text: "Already have an Account? Log In"
                background_color: 0.68, 0.8, 0.5, 0.18
                color: 0,0,0,1
                on_release:
                    root.manager.transition.direction = "left"
                    root.loginBtn()

            MDRaisedButton:
                pos_hint:{"x":0.2,"y":0.05}
                size_hint: 0.6, 0.2
                font_size: (root.width**2 + root.height**2) / 13**4
                text: "Create Account"
                on_release:
                    root.manager.transition.direction = "up"
                    root.createBtn()

<CreateAccountWindow>:
    GridLayout:
        cols: 1

        MDRaisedButton:
            text: 'Goto MainWindow'
            on_release: root.manager.current = 'main'

        MDLabel:
            text: 'Create Account Window'
            font_size: sp(50)

<MainWindow>:
    GridLayout:
        cols: 1

        MDRaisedButton:
            text: 'Goto LoginWindow'
            on_release: root.manager.current = 'login'

        MDLabel:
            text: 'Main Window'
            font_size: sp(50)

""")


def invalidLogin():
    pop = Popup(title='Invalid Login',
                content=Label(text='Invalid username or password.'),
                size_hint=(None, None), size=(400, 400))
    pop.open()


def invalidForm():
    pop = Popup(title='Invalid Form',
                content=Label(text='Please fill in all inputs with valid information.'),
                size_hint=(None, None), size=(400, 400))

    pop.open()


class LoginWindow(Screen):
    email = ObjectProperty(None)
    password = ObjectProperty(None)

    def loginBtn(self):
        self._shadow = App.get_running_app().theme_cls.quad_shadow
        print(f"\nloginBtn: self._shadow={self._shadow}")

        if db.validate(self.email.text, self.password.text):
            MainWindow.current = self.email.text
            self.reset()
            self.manager.current = "main"
        else:
            invalidLogin()

    def createBtn(self):
        self.reset()
        self.manager.current = "create"

    def reset(self):
        self.email.text = ""
        self.password.text = ""


class CreateAccountWindow(Screen):
    pass


class MainWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class FrameWork(App):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = "DeepPurple"
    title = "Frame Work"

    def build(self):
        return WindowManager()


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

输出

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57129106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档