Kivy KV文件的行为与Builder.load_string不同 [英] Kivy kv file behaves different from Builder.load_string

查看:286
本文介绍了Kivy KV文件的行为与Builder.load_string不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在kivy上实现2屏幕应用程序.我已经按照他们的示例进行了操作,如果在main.py中调用了"Builder.load_string",它就可以工作.

I'm trying to implement a 2 screen app on kivy. I have followed their example and it works if "Builder.load_string" is called in main.py.

但是,如果我将其注释掉并创建一个.kv文件,我只会得到一个空白屏幕.我在做什么错了?

However, if I comment it out and create a .kv file, I just get a blank screen. What am I doing wrong?

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()

这是testapp.kv

And here is 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'

推荐答案

调用run时,但在build方法之前,App类将加载kv文件.您在此之前实例化小部件(在App类声明上方),因此kv规则尚未加载并且不适用.要对其进行修复,请将实例化移动到build方法.

The kv file is loaded by the App class when run is called, but before the build method. You instantiate your widgets before this (above the App class declaration), so the kv rules haven't yet been loaded and do not apply. To fix it, move the instantiation to the build method.

修改:更改:

# 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

这篇关于Kivy KV文件的行为与Builder.load_string不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆