[英]Kivy: How to access a nested screenmanager from within any screen in kvlang
[英]Kivy: screen defined in kvlang, how to add to screenmanager in python?
当您拥有一个带有一个屏幕的屏幕管理器时,请使用kvlang:
<ScreenManagement>:
ScreenOne:
<ScreenOne>:
name: 'First'
id: screen1
<ScreenTwo>:
name: 'Second'
id: screen2
可以看到,您还定义了第二个屏幕,但是没有将其添加到屏幕管理器中。
如何使用python添加它? (我想根据配置文件中的某些条件来执行此操作)
我知道我可以使用add_widget()
将小部件添加到add_widget()
但是我不知道如何从python引用ScreenTwo。
我尝试使用ID,但是使用以下代码得到keyError:
class ScreenManagement(ScreenManager):
def __init__(self,**kwargs):
super().__init__(**kwargs)
def setup(*args):
if True: #under some condition, I want to add ScreenTwo
#this does not work: KeyError
screen_widget = App.get_running_app().root.ids['screen2']
self.add_widget(screen_widget)
Clock.schedule_once(setup)
首先,在您的kv
文件中,确保ScreenTwo
是Screen
的子类: <ScreenTwo@Screen>:
其次,尖括号表示规则而非实际实例。 这只是意味着,如果实例化与规则匹配的对象,它将获得这些属性。 要在Python代码中实例化ScreenTwo
的实例,请使用Factory
:
screen_widget = Factory.ScreenTwo()
您做错了几件事。 首先, <
和>
中的内容称为规则。 这些规则控制着在Python或kv中调用ScreenOne()
时如何ScreenOne()
。 其次,您无法将ID添加到规则,然后无法从根窗口小部件访问该ID。 正确的方法是在我的kv文件中。 您将id移到<ScreenManagement>
规则中。 最后,您可以通过执行print self.children
始终查看kv文件的print self.children
。
kvlang = '''
<ScreenManagement>:
ScreenOne:
id: screen1
<ScreenOne>:
name: 'First'
<ScreenTwo>:
name: 'Second'
'''
class ScreenManagement(ScreenManager):
def __init__(self,**kwargs):
super(ScreenManagement,self).__init__(**kwargs)
Clock.schedule_once(self.setup)
def setup(self,*args):
if True: #under some condition, I want to add ScreenTwo
print self.children, self.current
self.add_widget(ScreenTwo())
self.current = 'Second'
print self.children, self.current
print self.ids
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.