如何在标签中显示当前屏幕名称?

1 投票
1 回答
2373 浏览
提问于 2025-04-18 08:50

我正在使用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 小部件,而前者是当前屏幕的字符串名称。

撰写回答