python - 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'
解决方案
我认为这可能是由于您的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'
推荐阅读
- arrays - Swift - 从 Firebase 检索数组中的 getdocuments
- mysql - MySQL 8.0.16 (Windows) 组复制新设置:无法添加第二个成员
- javascript - dc.js - 在一组中一起渲染两个对象(一个图表 - 渲染,一个形状 - 不)?
- elasticsearch - 弹性搜索中的 primary_term 到底是什么?
- laravel - 将 Laravel 排队作业作为 Windows 服务运行
- stm32 - I2C 在内存读取时返回 Busy 或 Error
- javascript - for ... of 语句:转到可迭代的下一个元素
- windows - 在 POST 中转义 JSON 数据
- python - SQLAlchemy 核心从(0..1)一对一关系中的连接表中选择引发不明确的名称 InvalidRequestError
- python-3.x - 为什么 Telethon 不适用于 Tor 捆绑包