如何在标签中显示当前屏幕名称?
我正在使用Kivy的屏幕管理器,想在一个标签上显示当前屏幕的名称。但是当我用以下标签运行应用时,我的应用会立刻崩溃。
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行有问题吗,还是因为在这段代码运行时当前屏幕还没有创建?如果是后者,我该怎么让它等到当前屏幕存在后再执行呢?
1 个回答
2
这个问题出现的原因是因为还没有 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
实例可以通过 manager
属性访问它们的 ScreenManager
。
另外,你要使用 current
,而不是 current_screen
。后者是实际的 Screen
小部件,而前者是当前屏幕的字符串名称。