title: How to add for each screen an own .py and .kv file?
body: <p>I want to have a seperate .py and .kv file for each sreen. Over the ScreenManager in main.py/main.kv the screen should be selected. The design should be loaded from the file screen_X.kv and the classes etc. should be loaded from the file screen_X.py.</p>
  
  <p><strong>Screens:</strong></p>
  
  <ul>
  <li>Screen 1</li>
  <li>Screen 2</li>
  <li>Screen 3</li>
  </ul>
  
  <p><strong>Files:</strong></p>
  
  <ul>
  <li>(main.py)</li>
  <li>(showcase.kv)</li>
  <li>screen_1.py</li>
  <li>screen_1.kv</li>
  <li>screen_2.py</li>
  <li>screen_2.kv</li>
  <li>screen_3.py</li>
  <li>screen_3.kv</li>
  </ul>
  
  <p>This makes the program can be easily extended. How can I achieve this?</p>
  
  <hr>
  
  <p>With this code I have seperated .kv files. But I need also separated .py files.</p>
  
  <p>main.py</p>
  
  <pre><code>from time import time
  from kivy.app import App
  from os.path import dirname, join
  from kivy.lang import Builder
  from kivy.properties import NumericProperty, BooleanProperty, ListProperty
  from kivy.clock import Clock
  from kivy.uix.screenmanager import Screen
  
  
  class ShowcaseScreen(Screen):
      fullscreen = BooleanProperty(False)
  
      def add_widget(self, *args):
          if 'content' in self.ids:
              return self.ids.content.add_widget(*args)
          return super(ShowcaseScreen, self).add_widget(*args)
  
  
  class ShowcaseApp(App):
      time = NumericProperty(0)
      screen_names = ListProperty([])
      bool_menu = BooleanProperty(False)
  
      def build(self):
          self.title = 'hello world'
          Clock.schedule_interval(self._update_clock, 1 / 60.)
          self.available_screens = [
              'Buttons', 'CheckBoxes', 'ProgressBar', 'Switches', 'ToggleButton',
          ]
          self.screen_names = self.available_screens
          curdir = dirname(__file__)
          self.available_screens = [join(curdir, 'data', 'screens', '{}.kv'.format(fn)) for fn in self.available_screens]
  
          self.menu_screen = join(curdir, 'data', 'screens', '{}.kv'.format('Menu'))
  
          self.go_menu()
  
      def go_screen(self, idx):
          screen = Builder.load_file(self.available_screens[idx])
          self.root.ids.sm.switch_to(screen, direction='left')
  
      def go_menu(self):
          if not self.bool_menu:
              screen = Builder.load_file(self.menu_screen)
              self.root.ids.sm.switch_to(screen, direction='right')
  
      def _update_clock(self, dt):
          self.time = time()
  
  if __name__ == '__main__':
      ShowcaseApp().run()
  </code></pre>
  
  <p>showcase.kv</p>
  
  <pre><code>#:kivy 1.8.0
  #:import KivyLexer kivy.extras.highlight.KivyLexer
  #:import Factory kivy.factory.Factory
  
  &lt;ActionSpinnerOptions@SpinnerOption&gt;
      background_color: .4, .4, .4, 1
  
  &lt;ActionSpinner@Spinner+ActionItem&gt;
      canvas.before:
          Color:
              rgba: 0.128, 0.128, 0.128, 1
          Rectangle:
              size: self.size
              pos: self.pos
      border: 27, 20, 12, 12
      background_normal: 'atlas://data/images/defaulttheme/action_group'
      option_cls: Factory.ActionSpinnerOptions
  
  &lt;ActionDropdown&gt;:
      on_size: self.width = '220dp'
  
  &lt;ShowcaseScreen&gt;:
      ScrollView:
          do_scroll_x: False
          do_scroll_y: False if root.fullscreen else (content.height &gt; root.height - dp(16))
          AnchorLayout:
              size_hint_y: None
              height: root.height if root.fullscreen else max(root.height, content.height)
              GridLayout:
                  id: content
                  cols: 1
                  spacing: '8dp'
                  padding: '8dp'
                  size_hint: (1, 1) if root.fullscreen else (.8, None)
                  height: self.height if root.fullscreen else self.minimum_height
  
  
  BoxLayout:
      orientation: 'vertical'
  
      canvas.before:
          Color:
              rgb: .6, .6, .6
          Rectangle:
              size: self.size
              source: 'data/background.png'
  
      ActionBar:
  
          ActionView:
              id: av
              ActionPrevious:
                  with_previous: (False if app.bool_menu == True else True) if not app.bool_menu else False
                  title: 'Menu'
                  on_release: app.go_menu()
  
              ActionSpinner:
                  id: spnr
                  important: True
                  text: 'Select Program'
                  values: app.screen_names
                  on_text:
                      if (spnr.text != 'Select Program') and (sm.current != args[1]):\
                      idx = app.screen_names.index(args[1]);\
                      app.go_screen(idx)
  
      ScreenManager:
          id: sm
          on_current_screen:
              screen_name = args[1].name
  
              spnr.text = 'Select Program' if screen_name == 'Menu' else screen_name
  
              if screen_name == 'Menu': app.bool_menu = True
              else: app.bool_menu = False
  </code></pre>