.kv 文件似乎不起作用

.kv file doesn't seem to work

所以我只是在使用一些示例 Kivy 文件代码,我遇到了允许用户在屏幕之间切换的代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_string("""
<MenuScreen>:
    BoxLayout:
        Button:
            text: 'Build Scenario'
            on_press: root.manager.current = 'settings'
        Button:
            text: 'Run Existing Scenerio'

<SettingsScreen>:
    BoxLayout:
        Button:
            text: 'Run Existing Scenerio'
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'menu'
""")

# Declare both screens
class MenuScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

# Create the screen manager
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))

class TestApp(App):

    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()

我想知道是否可以将 Builder.load_string() 方法中给出的代码放入一个单独的 .kv 文件中。所以我就这么做了。我将 Builder 部分注释掉(我承认我不知道它的作用是什么)并将字符串复制到一个 .kv 文件中,如下所示:

 # the file name is test.kv
 #:kivy 1.0.9

<MenuScreen>:
    BoxLayout:
        Button:
            text: 'Build Scenario'
            on_press: root.manager.current = 'settings'
        Button:
            text: 'Run Existing Scenerio'

<SettingsScreen>:
    BoxLayout:
        Button:
            text: 'Run Existing Scenerio'
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'menu'

不幸的是,当我 运行 现在的代码时,我只得到一个黑屏。谁能告诉我怎么了?谢谢!

代码在 python 文件的主体中创建屏幕管理器 (sm)。当从文件加载 kv 时,这只会在稍后发生,因此 none 的 kv 规则将应用于 sm。之前没问题,因为 load_string 发生在实例化之前。

因此,以这种方式实例化小部件是不好的做法,sm = ScreenManager(... 等应移至构建方法。这是加载 kv 文件后 运行,所以一切正常。