Python 基维:如何改变ScreenManager';s";“当前”;_u_init上的属性__

Python 基维:如何改变ScreenManager';s";“当前”;_u_init上的属性__,python,kivy,Python,Kivy,我的应用程序是一个屏幕管理器。根据具体情况,我希望在应用程序打开时,活动屏幕为“屏幕1”或“屏幕2”。我该如何以最优雅的方式来做呢?我认为这与在应用程序初始化中更改current属性一样微不足道。遗憾的是,这不起作用。以下是imo应该采取的措施: main.py: MyApp(App): def build(self): return Builder.load_file("MyApp.kv") def __init__(self, **kwargs):

我的应用程序是一个屏幕管理器。根据具体情况,我希望在应用程序打开时,活动屏幕为“屏幕1”或“屏幕2”。我该如何以最优雅的方式来做呢?我认为这与在应用程序初始化中更改
current
属性一样微不足道。遗憾的是,这不起作用。以下是imo应该采取的措施:

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...
我的猜测是,在设置
root
之前,我将
current
属性设置为early。我的想法是1)为MyApp创建一个属性变量,2)将
current
设置为该属性,3)在init方法中更改该属性。仅仅为了在初始化时更改屏幕,就需要大量的工作和代码混乱


我该怎么做?提前多谢

这只是因为没有指定
self.root
对象。为什么您需要在
\uuuuu init\uuuu
期间更改屏幕?您应该使用
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()
随机导入
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.screenmanager导入screenmanager
Builder.load_字符串(“”)
:
屏幕:
名称:“屏幕1”
标签:
文本:“屏幕1!”
屏幕:
名称:“屏幕2”
标签:
文本:“屏幕2!”
''')
类根(屏幕管理器):
通过
类别MyApp(应用程序):
def生成(自):
self.root=root()
foo=random.randint(0,1)
如果是foo:
self.root.current=“屏幕1”
其他:
self.root.current=“屏幕2”
返回自根
MyApp().run()

self.root.cureent\u屏幕
属性将在
self.root
对象可见之前更改

,但这是一个额外的、我认为很麻烦的步骤,只需更改
root
。我通过将屏幕的更改再安排一帧来解决这个问题,就像这样
Clock.schedule\u once(self.set\u current\u screen)
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()