初始构建App

时间:2019-02-21 23:31:29

标签: python kivy

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

我从PalimPalims answer here借用了此示例代码。当您更改设置时,它非常有用,但是在更改设置面板中的值之前,“标签”小部件没有文本。将App导入构建部分后,我尝试将其添加到kv语言部分的文本text: App.get_running_app().config.get('Label','content')中。

我还尝试在Apps构建功能中分配小部件值,但始终收到错误“ MyApp没有ID”。我必须相信这是可行的,而我只是在阅读docs中的方法。

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

1 个答案:

答案 0 :(得分:0)

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

从基维文档:

  

on_start()

     

on_start事件的事件处理程序,此事件在之后触发   初始化(在调用build()之后)但在   应用程序已开始运行。

基本上,self.whatever函数完成后,您就可以访问应用程序的变量,例如build()on_start()完成后会自动调用build()