【发布时间】:2015-12-07 20:46:45
【问题描述】:
我正在使用 Kivy,并且正在尝试设置 ScreenManager,但我不希望 ScreenManager 成为我窗口中的根小部件。这是一个测试代码 sn-p 演示我正在尝试做的事情。 (这段代码演示了我的问题。)
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()
当我运行这段代码时,窗口是空白的,虽然我希望它会显示文本“foo screen”?
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 而不是返回 root,它也可以在显示屏上看到标签“foo screen”。
顺便说一句,我不想让屏幕管理器成为根小部件的原因是因为我希望能够在任何一个活动屏幕前面的屏幕上打印消息(几乎就像弹出窗口)(即使屏幕在过渡的过程),所以我想我需要屏幕管理器不是 root 才能做到这一点?
另外我的最终目标是在窗口中有多个“象限”,每个“象限”都有自己的屏幕管理器,所以我想我需要确保我可以显示不是根小部件的屏幕管理器才能做到这一点.
因此,如果我有更好的方法可以做到这一点,请告诉我。此外,我不想为此使用 .kv 文件,因为我想根据其他配置选项以编程方式设置整个环境(我在本示例中省略了。)
总的来说,我想知道是否有人知道为什么这段代码不起作用?
谢谢! 布赖恩
【问题讨论】: