关于Kivy中的属性错误的问题

问题描述

from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivymd.app import MDApp
from kivymd.uix.screen import Screen
from kivy.lang import Builder
from Help import help
from kivymd.uix.dialog import mddialog


class Begins(MDApp):
   def build(self):
    self.theme_cls.primary_palette = "Yellow"
    self.theme_cls.primary_hue = "A700"
    self.theme_cls.theme_style = "Dark"
    screen = Screen()
    self.id_v = Builder.load_string(help)
    screen.add_widget(self.id_v)

    return screen

class My(FloatLayout):
   scr = ObjectProperty(None)
   def data(self):
       username = self.id_v.user.text
       password = self.id_v.passw.text
       if username == "MD" and password == "kivy":
          print('ok')
       else:
          dial=mddialog(text='Opps Wrong!')
          dial.open()


Begins().run()

这是我的奇异果文件

   help = """
   Screen:
   id:scr    
   user:user
   passw:passw
   FloatLayout:    
    
    MDTextField:
        id: user
        hint_text : "Enter your Name"
        helper_text : "Have u forget it?"
        helper_text_mode : "on_focus"
        icon_right : "android"
        icon_right_color : app.theme_cls.primary_color
        size_hint_x :None
        width : '300'
        pos_hint:{'center_x':0.5,'center_y':0.6}
    MDTextField:    
        id: passw
        hint_text : "Enter your Password"
        helper_text : "Got it?"
        helper_text_mode : "on_focus"
        icon_right : "key"
        icon_right_color : app.theme_cls.primary_color
        size_hint_x :None
        width : '300'
        pos_hint:{'center_x':0.5,'center_y':0.5}
        pass: True
    MDRectangleFlatButton:
        text:"Log in"
        pos_hint:{'center_x': 0.5,'center_y': 0.4}
        on_release:root.data()

"""

显示AttributeError:“屏幕”对象没有属性“数据” 这是问题之一,另一个问题是,每当我认情况下将其导入到另一个文件时,它首先运行,因此在哪里使用if_name _ ==“ main ”:例如我正在使用此屏幕作为登录按钮。

解决方法

像这样保护您的run()呼叫:

if __name__ == '__main__':
    Begins().run()

在您的kv中,该行:

on_release:root.data()

调用该data()规则的root对象的kv方法。该规则的root似乎是Screen。来自documentation

root

此关键字仅在规则定义中可用并表示 规则的根窗口小部件(规则的第一个实例):

custom: 'Hello world'
Button:
    text: root.custom
,

使用了几个小时之后,我才发现它不是

on_release:root.data()

应该用

来引用
on_release:app.data()

*,只需在App类中移动数据功能即可。