簡體   English   中英

Kivy ScreenManager和BoxLayout

[英]Kivy ScreenManager and BoxLayout

我只是在學習Kivy的過程中,並舉了一個簡單的例子。 應該有兩個屏幕。 每個屏幕都應該有一個菜單欄。 菜單欄顯示在兩個屏幕的底部。 這很完美。 現在,我嘗試將菜單欄放在屏幕頂部,並且不要讓我的示例運行。

這是有效的代碼片段:

<ScreenOverview>:
    name:   "ScreenOverview"

    BoxLayout:
        orientation: "vertical"

        Button:
            text: 'Overview Screen'
            font_size: 50

        MenuBar:

當我用按鈕切換MenuBar時,我只會在底部看到按鈕:

<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'

我認為這可能是由於MenuBar擴展了Button 對於MenuBar擴展某種Layout類型更有意義。 這是菜單MenuBar擴展BoxLayout py代碼:

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不再包含BoxLayout ,因為MenuBarBoxLayout

#: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'

暫無
暫無

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

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