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

时间:2014-06-06 07:56:32

标签: python kivy

我使用的是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行是否有问题,还是因为运行此代码时尚未创建当前屏幕?如果是后者,如何让它等到当前屏幕存在之后?

1 个答案:

答案 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小部件,而前者是当前屏幕的字符串名称。