首页 > 解决方案 > Kivy ScreenManager 和 BoxLayout

问题描述

我只是在Kivy的学习过程中,做了一个简单的例子。应该有2个屏幕。每个屏幕都应该有一个菜单栏。菜单栏显示在 2 个屏幕的底部。这完美地工作。现在我尝试将菜单栏放在屏幕顶部,并且不让我的示例运行。

这是我的代码片段:

<ScreenOverview>:
    name:   "ScreenOverview"

    BoxLayout:
        orientation: "vertical"

        Button:
            text: 'Overview Screen'
            font_size: 50

        MenuBar:

当我用 Button 切换 MenuBar 时,我只看到底部的 Button:

<ScreenOverview>:
    name:   "ScreenOverview"

    BoxLayout:
        orientation: "vertical"

        MenuBar:

        Button:
            text: 'Overview Screen'
            font_size: 50

只有使用MenuBar,我才能看到MenuBar,而且在底部而不是顶部。

<ScreenOverview>:
    name:   "ScreenOverview"

    BoxLayout:
        orientation: "vertical"

        MenuBar:

我在这里搜索并尝试了许多提示和示例,但我的代码无法正常工作。谁能解释我的误会?

这是我完整的py代码:

import kivy
kivy.require('1.10.1') # replace with your current kivy version !

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition

class MenuBar( Button ):
    pass

class ScreenOverview( Screen ):
    def __init__( self, **kwargs ):
        super( ScreenOverview, self ).__init__( **kwargs )

    def switchToScreen( self ):
        if( self.manager.current == "ScreenBookings" ):
            self.manager.transition = SlideTransition( direction="left" )
            self.manager.current = "ScreenOverview"

class ScreenBookings( Screen ):
    def __init__( self, **kwargs ):
        super( ScreenBookings, self ).__init__( **kwargs )

    def switchToScreen( self ):
        if( self.manager.current == "ScreenOverview" ):
            self.manager.transition = SlideTransition( direction="right" )
            self.manager.current = "ScreenBookings"

class RVScreenManager( ScreenManager ):
    pass

class RVApp( App ):
    def build( self ):
        self.ScreenManager = RVScreenManager()

        self.ScreenOverview = ScreenOverview( name="ScreenOverview")
        self.ScreenManager.add_widget( self.ScreenOverview )

        self.ScreenBookings = ScreenBookings( name="ScreenBookings")
        self.ScreenManager.add_widget( self.ScreenBookings )

        return( self.ScreenManager )

    def switchScreenOverview( self ):
        self.ScreenOverview.switchToScreen()

    def switchScreenBookings( self ):
        self.ScreenBookings.switchToScreen()

Builder.load_file( "sf-fragen01.kv" )

if __name__ == '__main__':
    RVApp().run()

和 kv 文件:

#:import SlideTransition kivy.uix.screenmanager.SlideTransition

<RVScreenManager>:
    id: ScreenManager

    ScreenOverview:
        name: "ScreenOverview"
        screen_manager: "ScreenManager"
    ScreenBookings:
        name: "ScreenBookings"
        screen_manager: "ScreenManager"

<ScreenOverview>:
    name:   "ScreenOverview"

    BoxLayout:
        orientation: "vertical"

        Button:
            text: 'Overview Screen'
            font_size: 50

        MenuBar:

<ScreenBookings>:
    name: "ScreenBookings"

    BoxLayout:
        orientation: "vertical"

        Button:
            text: 'Bookings Screen'
            font_size: 50

        MenuBar:

<MenuButton@Button>:
    font_size:      20
    text_size:      self.size
    halign:         "center"
    valign:         "center"

<MenuBar>:
    name: "MenuBar"

    BoxLayout:
        size:       root.size[0], root.size[1]

        MenuButton:
            on_release:
                app.switchScreenOverview()
            text: 'Overview'

        MenuButton:
            on_release:
                app.switchScreenBookings()
            text: 'Bookings'

标签: pythonkivy

解决方案


我认为这可能是由于您的MenuBar扩展Button。扩展MenuBar某种类型的Layout. 这是您的 py 代码,MenuBar扩展名为BoxLayout

import kivy
from kivy.uix.boxlayout import BoxLayout

kivy.require('1.10.1') # replace with your current kivy version !

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition

class MenuBar( BoxLayout ):
    pass

class ScreenOverview( Screen ):
    def __init__( self, **kwargs ):
        super( ScreenOverview, self ).__init__( **kwargs )

    def switchToScreen( self ):
        if( self.manager.current == "ScreenBookings" ):
            self.manager.transition = SlideTransition( direction="left" )
            self.manager.current = "ScreenOverview"

class ScreenBookings( Screen ):
    def __init__( self, **kwargs ):
        super( ScreenBookings, self ).__init__( **kwargs )

    def switchToScreen( self ):
        if( self.manager.current == "ScreenOverview" ):
            self.manager.transition = SlideTransition( direction="right" )
            self.manager.current = "ScreenBookings"

class RVScreenManager( ScreenManager ):
    pass

class RVApp( App ):
    def build( self ):
        self.ScreenManager = RVScreenManager()

        self.ScreenOverview = ScreenOverview( name="ScreenOverview")
        self.ScreenManager.add_widget( self.ScreenOverview )

        self.ScreenBookings = ScreenBookings( name="ScreenBookings")
        self.ScreenManager.add_widget( self.ScreenBookings )

        return( self.ScreenManager )

    def switchScreenOverview( self ):
        self.ScreenOverview.switchToScreen()

    def switchScreenBookings( self ):
        self.ScreenBookings.switchToScreen()

Builder.load_file( "sf-fragen01.kv" )

if __name__ == '__main__':
    RVApp().run()

和顶部的.kv文件。MenuBar请注意,MenuBar不再包含 a BoxLayout,因为MenuBar是 a BoxLayout

#:import SlideTransition kivy.uix.screenmanager.SlideTransition

<RVScreenManager>:
    id: ScreenManager

    ScreenOverview:
        name: "ScreenOverview"
        screen_manager: "ScreenManager"
    ScreenBookings:
        name: "ScreenBookings"
        screen_manager: "ScreenManager"

<ScreenOverview>:
    name:   "ScreenOverview"

    BoxLayout:
        orientation: "vertical"

        MenuBar:

        Button:
            text: 'Overview Screen'
            font_size: 50

<ScreenBookings>:
    name: "ScreenBookings"

    BoxLayout:
        orientation: "vertical"

        MenuBar:

        Button:
            text: 'Bookings Screen'
            font_size: 50

<MenuButton@Button>:
    font_size:      20
    text_size:      self.size
    halign:         "center"
    valign:         "center"

<MenuBar>:
    name: "MenuBar"

    size:       root.size[0], root.size[1]

    MenuButton:
        on_release:
            app.switchScreenOverview()
        text: 'Overview'

    MenuButton:
        on_release:
            app.switchScreenBookings()
        text: 'Bookings'

推荐阅读