我的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'
有没有办法正确地进行此引用,而不会收到此错误?
答案 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'