我的应用程序是一个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方法中更改该属性。只是为了在初始化时更改屏幕,这需要付出很多努力和代码混乱。
我该怎么办?非常感谢提前!
答案 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
属性将被更改