2014-06-06 42 views
1

我正在使用Kivy Screen Manager,我试图在标签中显示当前屏幕的名称。但是当我用下面的标签运行应用程序时,我的应用程序立即崩溃。如何在标签内显示当前的屏幕名称?

MyScreenManager: 
    LoginScreen: 
    MenuScreen: 
    SettingsScreen: 
    LogoutScreen: 

<[email protected]>: 
    name: 'menu' 
    BoxLayout: 
    orientation: 'vertical' 
    Header: 
    Toolbar: 
    BoxLayout: 

<[email protected]>: 
    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

即使你想使用kv,如果在纯python中编写这个布局,你的代码是否运行? – barrios

回答

1

发生这种情况是因为没有app.root呢。您没有指定加载此kv的位置,但它必须在App构建之前发生。基本上,你不应该试图通过app.root来绑定任何东西。

来解决,这将取决于你的具体KV的方式,但这个工程,例如:

ScreenManager: 
    Screen: 
     name: 'a' 
     Label: 
      text: root.current 

如果ScreenManager是不是你千伏规则的根源,那么你就需要另一种方式将它绑定:

<[email protected]>: 
    name: 'a' 
    Label: 
     text: root.manager.current 

ScreenManager: 
    MyScreen 

Screen实例都可以访问ScreenManager通过manager属性的。您也可以使用current而不是current_screen。后者是实际的Screen小部件,而前者是当前屏幕的字符串名称。

+0

我的代码与您的最后一个示例相似,但是我有一个额外的规则在屏幕实例中引用。在这种情况下,它是BoxLayout“标题”。我想创建一些组件,例如将在几个屏幕中使用的标题。当我将标签文本更改为root.manager.current时,出现此错误AttributeError:'Header'对象没有属性'manager' – Frek

+0

我更新了原始问题中的代码,以清楚标签文本在小部件树中的位置。 – Frek

相关问题