Kivy:如何在__init__上更改ScreenManager的“当前”属性

时间:2017-03-13 17:50:49

标签: python kivy

我的应用程序是一个ScreenManager。根据具体情况,我希望当应用程序打开时,活动屏幕可以是“屏幕1”或“屏幕2”。我怎么能以最优雅的方式做到这一点?我认为这与在应用程序初始化中更改current属性一样简单。可悲的是,这不起作用。这是应该工作的东西:

main.py:

MyApp(App):
     def build(self):
         return Builder.load_file("MyApp.kv")

     def __init__(self, **kwargs):
         super(MyApp, self).__init__(**kwargs)

         if foo: # Here's the problem:
             self.root.current = "Screen 1"
         else:
             self.root.current = "Screen 2"

MyApp.kv:

ScreenManager:
    Screen1:
        name: "Screen 1"
    Screen2:
        name: "Screen 2"

<Screen1@Screen>
etc...

但事实并非如此。引发以下错误:

    self.root.current = "Screen 1"
AttributeError: 'NoneType' object has no attribute 'current'

我的猜测是我在设置current之前将root属性设置为提前。我的想法是1)为MyApp创建property-var,2)将current设置为该属性,3)在init方法中更改该属性。只是为了在初始化时更改屏幕,这需要付出很多努力和代码混乱。

我该怎么办?非常感谢提前!

1 个答案:

答案 0 :(得分:0)

这只是因为你没有指定self.root个对象。为什么在__init__期间需要更改屏幕?你应该使用build函数。

我的例子:

import random

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager

Builder.load_string('''
<Root>:
    Screen:
        name: "Screen 1"
        Label:
            text: "Screen 1!"

    Screen:
        name:"Screen 2"
        Label:
            text: "Screen 2!"
''')

class Root(ScreenManager):
    pass

class MyApp(App):
    def build(self):
        self.root = Root()

        foo = random.randint(0,1)
        if foo:
            self.root.current = "Screen 1"
        else:
            self.root.current = "Screen 2"

        return self.root



MyApp().run()
self.root.cureent_screen对象可见之前,

self.root属性将被更改