Python 基维:如何改变ScreenManager';s";“当前”;_u_init上的属性__
我的应用程序是一个屏幕管理器。根据具体情况,我希望在应用程序打开时,活动屏幕为“屏幕1”或“屏幕2”。我该如何以最优雅的方式来做呢?我认为这与在应用程序初始化中更改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):
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()