【问题标题】:Kivy ScreenManager and BoxLayoutKivy ScreenManager 和 BoxLayout
【发布时间】:2018-08-07 13:11:24
【问题描述】:

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

这是我工作的代码的 sn-p:

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

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    我认为这可能是由于您的MenuBar 扩展了ButtonMenuBar 扩展某种类型的 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()
    

    还有顶部带有MenuBar.kv 文件。注意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'
    

    【讨论】:

    • 这是问题所在,现在可以了!非常感谢。
    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多