我正在使用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;在显示屏上。
此外,我的最终目标是拥有多个&#34;象限&#34;在窗口中,每个都有自己的屏幕管理器,所以我想我需要确保我可以显示不是根小部件的屏幕管理器才能执行此操作。
因此,如果有更好的方法让我这样做,请告诉我。此外,我不想使用.kv文件,因为我想基于其他配置选项以编程方式设置整个环境(我已经从这个例子中省略了。)
总的来说,我想知道是否有人知道为什么这段代码不起作用?
谢谢! 布赖恩
答案 0 :(得分:1)
问题是您将ScreenManager
放在通用Widget
中。如果将它放在布局中,它将正确显示,即:
class MyRootWidget(BoxLayout):