Python Kivy使用kv文件中的ScreenManager

Python Kivy使用kv文件中的ScreenManager,python,kivy,Python,Kivy,我正在写一个kivy程序/游戏。我以前做过一个,但总共只有一个屏幕。我已经开始开发一个新的程序,其想法是实现一个屏幕管理器。我设法在python文件中构建了屏幕管理器,但它不适合我的长期使用,我想从.kv文件中尝试一个屏幕管理器 任何指导都将不胜感激,不知道我错过了什么。我看了这个问题v(),拼凑出我认为正确的,但仍然无法加载屏幕-我觉得这是一个简单的答案,我是瞎了 main.py from kivy.app import App from kivy.uix.screenmanager impo

我正在写一个kivy程序/游戏。我以前做过一个,但总共只有一个屏幕。我已经开始开发一个新的程序,其想法是实现一个
屏幕管理器
。我设法在python文件中构建了
屏幕管理器
,但它不适合我的长期使用,我想从
.kv文件
中尝试一个
屏幕管理器

任何指导都将不胜感激,不知道我错过了什么。我看了这个问题v(),拼凑出我认为正确的,但仍然无法加载屏幕-我觉得这是一个简单的答案,我是瞎了

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition


class MenuScreen(Screen):
    pass

class NewGameScreen(Screen):
    pass

class LoadGameScreen(Screen):
    pass

class ASCIILifeApp(App):
    pass

if __name__ == "__main__":
    ASCIILifeApp().run()
ASCIILife.kv

#: kivy 1.9
#: import ScreenManager kivy.uix.screenmanager.ScreenManager
#: import Screen kivy.uix.screenmanager.ScreenManager
#: import NewGameScreen screen
#: import LoadGameScreen screen

ScreenManager:
    id: screen_manager
    #transition: FadeTransition()
    MenuScreen:
        id: menu_screen
        name: 'MenuScreen'
        manager: 'screen_manager'
    NewGameScreen:
        id: newgame_screen
        name: 'NewGameScreen'
        manager: 'screen_manager'
    LoadGameScreen: 
        id: loadgame_screen
        name: 'LoadGameScreen'
        manager: 'screen_manager'

<MenuScreen>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'ASCII Life'
            font_size: 50
        Button:
            text: 'New Game'
            font_size: 30
            on_release: app.root.current = 'newgame'
        Button:
            text: 'Load Game'
            font_size: 30
            on_release: app.root.current = 'loadgame'
        Button:
            text: 'Settings'
            font_size: 30
            on_release: app.root.current = 'something'
<NewGameScreen>:
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: 'Game Length in Days'
                font_size: 30
            BoxLayout:
                orientation: 'horizontal'
                ToggleButton:
                    text: '100'
                    state: 'down'
                    group: 'newgame_days'
                    font_size: 30
                ToggleButton:
                    text: '200'
                    group: 'newgame_days'
                    font_size: 30
            BoxLayout:
                orientation: 'horizontal'
                ToggleButton:
                    text: '365'
                    group: 'newgame_days'
                    font_size: 30
                ToggleButton:
                    text: '3650'
                    group: 'newgame_days'
                    font_size: 30
            ToggleButton:
                text: 'Unlimited'
                group: 'newgame_days'
                font_size: 30
        BoxLayout:
            orientation: 'vertical'
            size_hint: (1, .5)
            Label:
                text: 'Difficulty (Score Multiplier)'
                font_size: 30
            BoxLayout:
                orientation: 'horizontal'
                ToggleButton:
                    text: 'Easy (x1)'
                    state: 'down'
                    group: 'newgame_difficulty'
                    font_size: 30
                ToggleButton:
                    text: 'Medium (x2.5)'
                    group: 'newgame_difficulty'
                    font_size: 30
                ToggleButton:
                    text: 'Hard (x5)'
                    group: 'newgame_difficulty'
                    font_size: 30
<LoadGameScreen>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'load a game'
            font_size: 30
        Widget:
            canvas:
                Ellipse:
                    pos: self.pos
                    size: self.size
        BoxLayout:
            Button:
                text: 'Menu'
                font_size: 30
                on_release: app.root.current = 'menu'
            Button:
                text: 'text'
                font_size: 30
:kivy 1.9
#:导入ScreenManager kivy.uix.ScreenManager.ScreenManager
#:导入屏幕kivy.uix.screenmanager.screenmanager
#:导入新游戏屏幕
#:导入LoadGameScreen屏幕
屏幕管理器:
id:屏幕管理器
#转换:FadeTransition()
菜单屏幕:
id:菜单屏幕
名称:“菜单屏幕”
经理:“屏幕经理”
新游戏屏幕:
id:newgame_屏幕
名称:“NewGameScreen”
经理:“屏幕经理”
LoadGameScreen:
id:loadgame\u屏幕
名称:'LoadGameScreen'
经理:“屏幕经理”
:
盒子布局:
方向:“垂直”
标签:
文本:“ASCII生活”
字体大小:50
按钮:
文字:“新游戏”
字体大小:30
发布时:app.root.current='newgame'
按钮:
文本:“加载游戏”
字体大小:30
发布时:app.root.current='loadgame'
按钮:
文本:“设置”
字体大小:30
发布时:app.root.current='something'
:
盒子布局:
方向:“垂直”
盒子布局:
方向:“垂直”
标签:
文字:“游戏长度(以天为单位)”
字体大小:30
盒子布局:
方向:“水平”
切换按钮:
文字:“100”
声明:“关闭”
小组:“新游戏日”
字体大小:30
切换按钮:
文字:“200”
小组:“新游戏日”
字体大小:30
盒子布局:
方向:“水平”
切换按钮:
文本:“365”
小组:“新游戏日”
字体大小:30
切换按钮:
文本:“3650”
小组:“新游戏日”
字体大小:30
切换按钮:
文字:“无限”
小组:“新游戏日”
字体大小:30
盒子布局:
方向:“垂直”
尺寸提示:(1.5)
标签:
文字:“难度(分数乘数)”
字体大小:30
盒子布局:
方向:“水平”
切换按钮:
文本:“简单(x1)”
声明:“关闭”
小组:“新游戏难度”
字体大小:30
切换按钮:
正文:“中等(x2.5)”
小组:“新游戏难度”
字体大小:30
切换按钮:
文本:“硬(x5)”
小组:“新游戏难度”
字体大小:30
:
盒子布局:
方向:“垂直”
标签:
文本:“加载游戏”
字体大小:30
小装置:
画布:
椭圆:
pos:self.pos
大小:self.size
盒子布局:
按钮:
文本:“菜单”
字体大小:30
发布时:app.root.current='菜单'
按钮:
文本:“文本”
字体大小:30

编辑:截断的kv文件

答案是使用生成器构建kv文件。我知道这很简单。档案如下

main.py

#!/usr/bin/kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ObjectProperty


class MenuScreen(Screen):
    pass

class NewGameScreen(Screen):
    pass

class LoadGameScreen(Screen):
    pass

class ScreenManager(ScreenManager):
    pass

buildKV = Builder.load_file("ASCIILife.kv")

class ASCIILifeApp(App):
    def build(self):
        return buildKV

if __name__ == "__main__":
    ASCIILifeApp().run()

要详细说明Chazara的发现:

或者根据命名约定重命名kv代码文件:

Kivy在中查找与应用程序类同名的Kv文件 小写,如果以“App”结尾,则减去“App”

从文件中:

只需使用builder函数将其显式化即可:

Builder.load_file('path/to/file.kv')

更详细地阐述Chazara的发现: 我用kivy 1.10.1dev0和Python 3.6测试了Chazara的代码;我的错误是:

 kivy.uix.screenmanager.ScreenManagerException: No Screen with name "something".
为了修复它,我在.kv文件中进行了更改

[...]    
Button:
   text: 'New Game'
   font_size: 30
   on_release: app.root.current = 'newgame'
[...]
致:

它引用了ScreenManager中给出的NewGameScreen的名称

    ScreenManager:
[...]
         NewGameScreen:
            id: newgame_screen
            *name: 'NewGameScreen'*
            manager: 'screen_manager'

如果你调用文件'asciilife.kv',它将自动加载。啊,我确实认为如果你删除'app'这个词,kv文件应该自动加载。我不知道它是区分大小写的。谢谢您可能还会发现,导入FadeTransition kivy.uix.screenmanager.FadeTransition更容易。这使FadeTransition()函数可用于kv文件,而无需使用生成器加载。
    ScreenManager:
[...]
         NewGameScreen:
            id: newgame_screen
            *name: 'NewGameScreen'*
            manager: 'screen_manager'