[英]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
,因為MenuBar
是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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.