title: Kivy: Access configuration values from any widget
body: <p>I'm using kivy to create a small App for computer aided learning.</p>
  
  <p>At the moment I have some problems with accessing config values.
  I get the value with</p>
  
  <p><code>self.language = self.config.get('basicsettings', 'language')</code></p>
  
  <p>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.</p>
  
  <p>I'm using a ScreenManager, which contains a Screen. Inside is a BoxLayout, which contains a GridLayout and this holds several AudioButtons.</p>
  
  <p>Now, in this AudioButton I want to know the current value of <code>self.language</code> defined in the mainApp.</p>
  
  <p>In .kv files I can do something like</p>
  
  <pre><code>`text: app.language`
  </code></pre>
  
  <p>to get it, but how to do it directly in Python?</p>
  
  <p>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 <code>on_config_change()</code> to update the value during runtime.</p>
  
  <p>Here's a very simplified version of my App with all interesting parts, I hope.</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>And the .kv file:</p>
  
  <pre><code>&lt;ScreenManagement&gt;:
      MainScreen:
      Lesson1:
  
  &lt;AudioButton&gt;:
      Label:
          id: language
          text: app.language
          color: 0, 0, 0, 0
      Label:
          id: playsound
          text: app.playsound
          color: 0, 0, 0, 0
  
  &lt;MainScreen&gt;:
      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
  
  &lt;Lesson1&gt;:
      name: "lesson1"
      id: lesson1
      BoxLayout:
          orientation: 'vertical'
          Pictures1:
              size_hint_y: 0.5
          BoxLayout:
              size_hint_y: 0.15
              Label:
                  text: ""
  </code></pre>