嵌套在BoxLayout中的ScreenManager不可见

时间:2015-02-15 21:17:19

标签: python kivy

我正在尝试使用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上运行。

1 个答案:

答案 0 :(得分:2)

我找到了解决方案;问题是我在super(BoxLayout, self)方法中调用了super(Container, self)而不是Container.__init__。一旦我改变了这一点,屏幕管理器及其屏幕就可以从容器中看到。