猿问

在应用程序的初始构建期间访问 Kivy 设置值

我正在学习如何实现 Kivy 设置面板。这对于几个用例来说是完美的,但我无法弄清楚如何在构建后立即在我的应用程序中显示设置的值。


我从这里的 PalimPalims 答案中借用了这个示例代码。更改设置时效果很好,但在更改设置面板中的值之前,标签小部件没有文本。text: App.get_running_app().config.get('Label','content')在将 App 导入构建部分后,我尝试将其添加到 kv 语言部分文本中。


我还尝试在 Apps 构建函数中分配小部件值,但一直收到错误“MyApp 没有 ids”。我必须相信这是可行的,我只是在阅读文档中的方法。


from kivy.app import App

from kivy.uix.textinput import TextInput

from kivy.uix.boxlayout import BoxLayout

from kivy.uix.label import Label

from kivy.uix.button import Button

from kivy.lang import Builder

from kivy.uix.label import Label

from kivy.config import Config



class Labelwithconfig(Label):


    def check_label(self):

        self.text = App.get_running_app().config.get('Label','content')


kv_str = Builder.load_string("""

BoxLayout:

    orientation: 'vertical'

    Labelwithconfig:

        id: labelconf

    Button:

        text: 'open settings'

        on_press: app.open_settings()

""")




class MyApp(App):

    def build_config(self, config):

        config.setdefaults('Label', {'Content': "Default label text"})


    def build_settings(self, settings):

        settings.add_json_panel("StackOverflow Test Settings", self.config, data="""

        [

        {"type": "options",

        "title": "Label text System",

        "section": "Label",

        "key": "Content",

        "options": ["Default label text", "Other Label text"]

        }

        ]"""

        )

    def on_config_change(self, config, section, key, value):

        self.root.ids.labelconf.check_label()


    def build(self):

        return kv_str



if __name__ == '__main__':

    MyApp().run()


慕斯709654
浏览 172回答 1
1回答

芜湖不芜

text: App.get_running_app().config.get('Label','content')当您的应用程序启动时不会显示您的文本,因为您的kv文件内容在您的App类完全加载之前加载。为了做你想做的事,覆盖类的on_start方法App(这是一个超级方便的技巧,有时新用户很难发现)。def on_start(self):    self.root.ids.labelconf.text = self.config.get('Label','content')来自 kivy 文档:on_start()on_start 事件的事件处理程序,在初始化之后(在调用 build() 之后)但在应用程序开始运行之前触发。基本上,您可以self.whatever在build()函数完成后访问应用程序的变量。完成on_start()时自动调用build()。
随时随地看视频慕课网APP

相关分类

Python
我要回答