我正在尝试使用Kivy并尝试在BoxLayout中嵌套ScreenManager实例。我遇到的问题是当ScreenManager是BoxLayout的子窗口小部件时,ScreenManager及其屏幕不显示。
此代码显示黑屏。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen, ScreenManager
class MenuScreen(Screen):
def __init__(self, **kwargs):
super(Screen, self).__init__(**kwargs)
self.add_widget(Label(text="Some text."))
screen_manager = ScreenManager()
screen_manager.add_widget(MenuScreen(name="menu"))
class Container(BoxLayout):
def __init__(self, **kwargs):
super(BoxLayout, self).__init__(**kwargs)
self.add_widget(screen_manager)
class NestedScreenManagerApp(App):
def build(self):
"""
:return: a BoxLayout with the screen manager nested inside it
"""
return Container()
if __name__ == "__main__":
NestedScreenManagerApp().run()
另一方面,此代码(直接将ScreenManager作为根小部件返回)确实有效,并且MenuScreen及其Label可见。将ScreenManager作为根小部件返回正是the official screen manager example app所做的。
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen, ScreenManager
class MenuScreen(Screen):
def __init__(self, **kwargs):
super(Screen, self).__init__(**kwargs)
self.add_widget(Label(text="Some text."))
screen_manager = ScreenManager()
screen_manager.add_widget(MenuScreen(name="menu"))
class RootScreenManagerApp(App):
def build(self):
"""
:return: the screen manager directly
"""
return screen_manager
if __name__ == "__main__":
RootScreenManagerApp().run()
如果ScreenManager及其屏幕是我的Container(BoxLayout)的子窗口小部件,我怎样才能看到它?我想我错过了一些非常简单的事情。
我在Python 2.7.9上使用Kivy 1.8.0,在Debian Jessie上运行。
答案 0 :(得分:2)
我找到了解决方案;问题是我在super(BoxLayout, self)
方法中调用了super(Container, self)
而不是Container.__init__
。一旦我改变了这一点,屏幕管理器及其屏幕就可以从容器中看到。