Python Kivy kv文件的行为不同于Builder.load\u字符串

Python Kivy kv文件的行为不同于Builder.load\u字符串,python,kivy,Python,Kivy,我正在尝试在kivy上实现一个2屏应用程序。我遵循了他们的示例,如果在main.py中调用“Builder.load_string”,它就会起作用 然而,如果我注释掉它并创建一个.kv文件,我只会得到一个空白屏幕。我做错了什么 from kivy.app import App from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen #Builder.load_string(""

我正在尝试在kivy上实现一个2屏应用程序。我遵循了他们的示例,如果在main.py中调用“Builder.load_string”,它就会起作用

然而,如果我注释掉它并创建一个.kv文件,我只会得到一个空白屏幕。我做错了什么

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

#Builder.load_string("""
#<MainScreen>:
    #BoxLayout:
        #Button:
            #text: 'Goto settings'
            #on_press: root.manager.current = 'settings'
        #Button:
            #text: 'Quit'

#<SettingsScreen>:
    #BoxLayout:
        #Button:
            #text: 'My settings button'
        #Button:
            #text: 'Back to menu'
            #on_press: root.manager.current = 'main'
#""")

# Declare both screens
class MainScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

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

class TestApp(App):

    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.screenmanager导入screenmanager,屏幕
#生成器。加载\u字符串(“”)
#:
#盒子布局:
#按钮:
#文本:“转到设置”
#按:root.manager.current='settings'
#按钮:
#文本:“退出”
#:
#盒子布局:
#按钮:
#文本:“我的设置按钮”
#按钮:
#文本:“返回菜单”
#按:root.manager.current='main'
#""")
#声明两个屏幕
类主屏幕(屏幕):
通过
类别设置屏幕(屏幕):
通过
#创建屏幕管理器
sm=屏幕管理器()
sm.add_小部件(主屏幕(name='main'))
sm.add_小部件(设置屏幕(name='settings'))
类TestApp(应用程序):
def生成(自):
返回sm
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
这是testapp.kv

<MainScreen>:
    BoxLayout:
        Button:
            text: 'Goto settings'
            on_press: root.manager.current = 'settings'
        Button:
            text: 'Quit'

<SettingsScreen>:
    BoxLayout:
        Button:
            text: 'My settings button'
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'main'
:
盒子布局:
按钮:
文本:“转到设置”
按:root.manager.current='settings'
按钮:
文本:“退出”
:
盒子布局:
按钮:
文本:“我的设置按钮”
按钮:
文本:“返回菜单”
按:root.manager.current='main'

在调用run时,但在build方法之前,由App类加载kv文件。在此之前(在应用程序类声明上方)实例化了小部件,因此kv规则尚未加载且不适用。要修复它,请将实例化移动到build方法

编辑:更改:

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

class TestApp(App):

    def build(self):
        return sm

class TestApp(App):

    def build(self):
        # Create the screen manager
        sm = ScreenManager()
        sm.add_widget(MainScreen(name='main'))
        sm.add_widget(SettingsScreen(name='settings'))
        return sm