kivy,无法访问app.root属性

时间:2016-04-08 22:44:35

标签: python kivy

我的main.py和spend.kv中包含以下代码,如下所示

main.py

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.gridlayout import GridLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen

class Manager(ScreenManager):
   currency = '$'

class SpendApp(App):
   def build(self):
      control = Manager()
      return control

class First(Screen):
   pass

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

spend.kv

<Manager>:
    First


<First>:
    GridLayout:
        cols: 1
        Label: 
            text: 'Total spending'
            height: '48dp'
            size_hint_y: None
         Amount:
            height: '38dp'
            size_hint_y: None
            font_color: 1,0,0,1



<Amount@Label>:
   text: app.root.currency + '0.0'

当我运行此程序时,程序崩溃并出现以下错误:

AttributeError: 'NoneType' object has no attribute 'currency'

我知道这是因为我在spend.kv中对app.root.currency的反感 文件:

<Amount@Label>:
   text: app.root.currency + '0.0'

有没有办法正确地进行此引用,而不会收到此错误?

1 个答案:

答案 0 :(得分:2)

如果您使用以下代码:

<Amount@Label>:
    text: str(root) # 

您会发现Amount对象的根源是Amount对象本身,因为当您定义它时,它还没有在任何层次结构中。您只能在实际层次结构中访问root widged:

<First>:
    GridLayout:
        cols: 1
        Label: 
            text: str(root)

在此层次结构中,root对象被定义为First类的对象,它实际上是Screen小部件的实例,因此您必须使用manager属性为了访问您的Manager班级:

<First>:
    GridLayout:
        cols: 1
        Label: 
            text: root.manager.currency  + '0.0'