Kivy:将ScreenManager添加到窗口而不是root用户?

时间:2015-12-07 20:46:45

标签: python kivy

我正在使用Kivy而我正在尝试设置ScreenManager,但我不希望ScreenManager成为我窗口中的根窗口小部件。这是一个测试代码段,演示了我尝试做的事情。 (此代码演示了我的问题。)

__constructor__

当我运行此代码时,窗口是空白的,但我希望它会显示文本" foo screen"?

from kivy.app import App from kivy.uix.label import Label from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.widget import Widget class MyRootWidget(Widget): def __init__(self, **kwargs): super(MyRootWidget, self).__init__(**kwargs) self.screen_manager = ScreenManager() self.add_widget(self.screen_manager) # self.add_widget(Label(text='label direct')) class MyApp(App): def build(self): root = MyRootWidget() new_screen = Screen(name='foo') new_screen.add_widget(Label(text='foo screen')) root.screen_manager.add_widget(new_screen) root.screen_manager.current = 'foo' for x in root.walk(): print x return root if __name__ == '__main__': MyApp().run() 命令的打印显示根小部件包含screenmanager,我的屏幕和标签,如下所示:

walk()

这样就像我期望的那样工作。

如果我取消注释将标签小部件直接添加到根小部件的行,则该标签会按预期显示。

此外,如果我更改<__main__.MyRootWidget object at 0x109d59c80> <kivy.uix.screenmanager.ScreenManager object at 0x109eb4ae0> <Screen name='foo'> <kivy.uix.label.Label object at 0x109ecd390> 方法以使其返回MyApp.build()而不是返回new_screen,那么它也会起作用,因为我看到了标签&#34; foo screen&#34;在显示屏上。

BTW,我想让屏幕管理器不是root小部件的原因是因为我希望能够在屏幕上的任何一个活动屏幕前打印消息(几乎像弹出窗口)(即使屏幕在过渡的过程),所以我认为我需要屏幕管理员不要成为root用户才能做到这一点?

此外,我的最终目标是拥有多个&#34;象限&#34;在窗口中,每个都有自己的屏幕管理器,所以我想我需要确保我可以显示不是根小部件的屏幕管理器才能执行此操作。

因此,如果有更好的方法让我这样做,请告诉我。此外,我不想使用.kv文件,因为我想基于其他配置选项以编程方式设置整个环境(我已经从这个例子中省略了。)

总的来说,我想知道是否有人知道为什么这段代码不起作用?

谢谢! 布赖恩

1 个答案:

答案 0 :(得分:1)

问题是您将ScreenManager放在通用Widget中。如果将它放在布局中,它将正确显示,即:

class MyRootWidget(BoxLayout):

有几种可用的布局:http://kivy.org/docs/gettingstarted/layouts.html