簡體   English   中英

Kivy:不是以root身份將ScreenManager添加到窗口?

[英]Kivy: Add ScreenManager to window not as root?

我正在使用Kivy,並且試圖設置ScreenManager,但是我不希望那個ScreenManager成為窗口中的根窗口小部件。 這是一個測試代碼片段,演示了我正在嘗試做的事情。 (此代碼演示了我的問題。)

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()命令的打印顯示,根小部件包含screenmanager,我的屏幕和標簽,如下所示:

<__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”。

順便說一句,我不想​​讓屏幕管理器成為根窗口小部件的原因是因為我希望能夠在屏幕處於活動狀態的任何一個屏幕上打印消息(幾乎像彈出窗口一樣)(即使屏幕處於活動狀態)過渡),所以我想我需要不成為屏幕管理員才能做到這一點?

我的最終目標也是在窗口中有多個“象限”,每個“象限”都有自己的屏幕管理器,因此我想我需要確保可以顯示不是根窗口小部件的屏幕管理器來執行此操作。

因此,如果我有更好的方法可以進行此操作,請告訴我。 我也不想為此使用.kv文件,因為我想基於其他配置選項以編程方式設置整個環境(在本示例中已將其省略)。

總的來說,盡管我想知道是否有人知道為什么這段代碼不起作用?

謝謝! 布賴恩

問題是您將ScreenManager粘貼在通用Widget 如果將其放在布局中,它將正確顯示,即:

class MyRootWidget(BoxLayout):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM