【问题标题】:Kivy Using a ScreenManager from kv fileKivy 使用来自 kv 文件的 ScreenManager
【发布时间】:2016-01-12 16:15:04
【问题描述】:

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

任何指导将不胜感激,不知道我错过了什么。我看了这个问题v(Kivy - Screen Manager - Accessing attribute in other class),把我认为正确的东西拼凑起来,但仍然无法加载屏幕——我觉得这是一个简单的答案,我是瞎了......

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

编辑:截断的 kv 文件

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    答案是使用构建器来构建 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()
    

    【讨论】:

    • 如果你调用文件'asciilife.kv',它会自动加载。
    • Ahhhh 我确实认为 kv 文件应该自动加载,如果您删除单词“app”。我没有意识到它是区分大小写的。谢谢!
    • 您可能还会发现 #:import FadeTransition kivy.uix.screenmanager.FadeTransition 更容易。这使得 FadeTransition() 函数可用于 kv 文件,而无需使用 Builder 加载。
    【解决方案2】:

    详细说明 Chazara 的发现:

    或者按照命名约定重命名kv代码文件:

    Kivy 会在其中查找与您的 App 类同名的 Kv 文件 小写,如果以“App”结尾,则减去“App”。

    来自文档:how to load kv language

    或者只需使用构建器函数明确说明:

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

    【讨论】:

      【解决方案3】:

      进一步详细说明 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'
      [...]
      

      到:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 2018-11-04
        • 2015-08-16
        • 2016-01-16
        相关资源
        最近更新 更多