Kivy: Access configuration values from any widget

Viewed 3068

I'm using kivy to create a small App for computer aided learning.

At the moment I have some problems with accessing config values. I get the value with

self.language = self.config.get('basicsettings', 'language')

in the main App-Class. That works fine, however, I don't know how to access these value inside another widget - in this case the AudioButton.

I'm using a ScreenManager, which contains a Screen. Inside is a BoxLayout, which contains a GridLayout and this holds several AudioButtons.

Now, in this AudioButton I want to know the current value of self.language defined in the mainApp.

In .kv files I can do something like

`text: app.language`

to get it, but how to do it directly in Python?

If I use a dummy label in kv to get the value, it works, but when I change the setting, I need to restart the App, because I don't know what I need to add to on_config_change() to update the value during runtime.

Here's a very simplified version of my App with all interesting parts, I hope.

class AudioButton(Button):
    filename = StringProperty(None)
    sound = ObjectProperty(None, allownone=True)

    def on_press(self):
        if self.ids.playsound.text == '1':
            self.sound.play()
        else:
            print('NoSound')


class MainScreen(Screen):
    pass


class Pictures1(GridLayout):
    def __init__(self, **kwargs):
        super(Pictures1, self).__init__(**kwargs)
        self.cols = 2
        btn = AudioButton()
        self.add_widget(btn)
        btn = AudioButton()
        self.add_widget(btn)


class Lesson1(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


class LunahutsoApp(App):
    def build(self):
        self.settings_cls = SettingsWithSidebar
        self.use_kivy_settings = False
        self.language = self.config.get('basicsettings', 'language')
        self.playsound = self.config.get('basicsettings', 'playsound')
        return ScreenManagement()

    def build_config(self, config):
        config.setdefaults('basicsettings', {
            'language': 'austrian',
            'playsound': 1})

    def build_settings(self, settings):
        settings.add_json_panel('Lunahutso',
                                self.config,
                                data=settings_json)

    def on_config_change(self, config, section,
                         key, value):
        if key == 'language':
            self.language = value
        if key == 'playsound':
            self.playsound = value


if __name__ == "__main__":
    LunahutsoApp().run()

And the .kv file:

<ScreenManagement>:
    MainScreen:
    Lesson1:

<AudioButton>:
    Label:
        id: language
        text: app.language
        color: 0, 0, 0, 0
    Label:
        id: playsound
        text: app.playsound
        color: 0, 0, 0, 0

<MainScreen>:
    name: "main"
    BoxLayout:
        orientation: 'vertical'
        Button:
            on_release: app.root.current = "lesson1"
            text: "Lesson"
            font_size: 50
        Button:
            on_release: app.open_settings()
            text: "Settings"
            font_size: 50
        Button:
            on_release: sys.exit()
            text: "Quit"
            font_size: 50

<Lesson1>:
    name: "lesson1"
    id: lesson1
    BoxLayout:
        orientation: 'vertical'
        Pictures1:
            size_hint_y: 0.5
        BoxLayout:
            size_hint_y: 0.15
            Label:
                text: ""
2 Answers
Related