首页 > 解决方案 > 如何在 .kv 中引用应用程序?任何引用都以 AttributeError 结尾

问题描述

我想使用应用程序中的属性,但任何引用都以: AttributeError: 'NoneType' object has no attribute 'bind' 以下是我的代码的一部分:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty
from kivy.lang import Builder

class FightScreen(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass


# design constructor
kv = Builder.load_file('AppDesign.kv')

class Design(App):
    def __init__(self, **kwargs):
        super(Design, self).__init__(**kwargs)
        self.main_hero = MainHero() # Tried main_hero = MainHero() too
        self.val = self.main_hero.nick  # string

    # Construct app
    def build(self):
        return kv

if __name__ == "__main__":
    Design().run()
# Using kv 2.0
ScreenManagement:
    id: screen_manager
    FightScreen:
        name: 'FightScreen'
        manager: screen_manager
        id: fight_screen

<FightScreen>

FloatLayout:
     BasicBackground
     Label:
          text: app.val
          pos_hint: {'center_x': .5, 'center_y': .35}

任何在 .kv 中引用应用程序的尝试都将导致错误。我尝试使用

StringProperty; apply_property(**kwargs); 通过ScreenManagement/参考FightScreen

访问应用程序属性的问题

标签: pythonkivykivy-language

解决方案


app属性是None直到App创建。只需将 的加载移动kv到 的build()方法中App,以便在App创建之前不会执行它:

class Design(App):
    val = StringProperty('default')

    def __init__(self, **kwargs):
        super(Design, self).__init__(**kwargs)
        self.main_hero = MainHero() # Tried main_hero = MainHero() too

    # Construct app
    def build(self):
        # design constructor
        kv = Builder.load_file('AppDesign.kv')
        return kv

推荐阅读