我使用的是Kivy Screen Manager,我试图在标签中显示当前屏幕的名称。但是,当我使用以下标签运行应用程序时,我的应用程序立即崩溃。
MyScreenManager:
LoginScreen:
MenuScreen:
SettingsScreen:
LogoutScreen:
<MenuScreen@Screen>:
name: 'menu'
BoxLayout:
orientation: 'vertical'
Header:
Toolbar:
BoxLayout:
<Header@BoxLayout>:
orientation: 'vertical'
height: 100
size_hint_x: 1
size_hint_y: None
Label:
text: 'Dealer App'
color: 0.212, 0.486, 0.169, 1
font_size: 48
Label:
height: 30
text_size: self.width*.9, None
halign: 'right'
size_hint_y: None
text: app.root.current_screen
font_size: 16
color: 0, 0, 1, 1
第一个屏幕上没有使用此标签,但启动应用程序时出现以下错误。
...
89: halign: 'right'
90: size_hint_y: None
>> 91: text: app.root.current_screen
92: font_size: 16
93: color: 0, 0, 1, 1
...
AttributeError: 'NoneType' object has no attribute 'bind'
我想使用kv语言添加此标签。第91行是否有问题,还是因为运行此代码时尚未创建当前屏幕?如果是后者,如何让它等到当前屏幕存在之后?
答案 0 :(得分:1)
这是因为还没有app.root
。您没有指定加载此kv的位置,但必须在App
构建之前进行。基本上,您不应该尝试通过app.root
绑定任何内容。
解决这个问题的方法取决于您的确切kv,但这可以用作例如:
ScreenManager:
Screen:
name: 'a'
Label:
text: root.current
如果ScreenManager
不是您的kv规则的根,那么您需要以另一种方式绑定它:
<MyScreen@Screen>:
name: 'a'
Label:
text: root.manager.current
ScreenManager:
MyScreen
Screen
个实例可以通过ScreenManager
属性访问其manager
。
此外,您要使用current
,而不是current_screen
。后者是实际的Screen
小部件,而前者是当前屏幕的字符串名称。