2015-08-19 35 views
3

我想爲每個屏幕分別提供.py和.kv文件。在main.py/main.kv中的ScreenManager上,應該選擇屏幕。應該從文件screen_X.kv加載設計,並且應該從文件screen_X.py加載類等。如何爲每個屏幕添加一個自己的.py和.kv文件?

屏幕:

  • 屏幕1
  • 屏幕2
  • 屏幕3個

文件:

  • (main.py)
  • (showcase.kv)
  • screen_1.py
  • screen_1.kv
  • screen_2.py
  • screen_2.kv
  • screen_3.py
  • screen_3.kv

這使得程序可以很容易地擴展。我怎樣才能做到這一點?


有了這段代碼,我有分離的.kv文件。但我也需要分離.py文件。

main.py

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

showcase.kv

#:kivy 1.8.0 
#:import KivyLexer kivy.extras.highlight.KivyLexer 
#:import Factory kivy.factory.Factory 

<[email protected]> 
    background_color: .4, .4, .4, 1 

<[email protected]+ActionItem> 
    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 

<ActionDropdown>: 
    on_size: self.width = '220dp' 

<ShowcaseScreen>: 
    ScrollView: 
     do_scroll_x: False 
     do_scroll_y: False if root.fullscreen else (content.height > 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 
+3

對於程序中的每個屏幕,有兩個源文件會使擴展和管理變得更加困難,而不是更少。另外,您能向我們展示一些您開始使用的代碼,以及您在完成此操作時所做的任何嘗試嗎? – TigerhawkT3

+0

我已編輯我的帖子。 – user2534685

+0

你可以把類放在單獨的文件中,只需要'''導入''它們在主? – bj0

回答

2

首先,你沒有提到你是否知道如何設置不同的屏幕通常的方式,和我不確定我在上面的代碼中看到它。如果你不這樣做,那麼創建一個簡單的多屏幕設置有一個相當簡單的教程here

每個屏幕都是從Screen繼承的類,只需在單獨的.py文件中定義這些屏幕類並將它們導入到main.py文件中並不困難。我以前做過這個。例如,我有我的main.py(你需要),我有我所有的各種屏幕定義在一個名爲'game_screen.py'的py文件,並從那裏簡單地導入。

我自己並沒有多次使用過多個kv文件,但是我知道您可以使用類似的代碼將kv規則添加到您的主要(默認)kv文件規則中。我相信,儘管這些規則必須先加載到它們才能正常工作的小部件之前。

from kivy.lang import Builder 
Builder.load_file('screen1.kv') 
Builder.load_file('screen2.kv') 
Builder.load_file('screen3.kv') 

所以通過導入你的屏幕類的main.py和使用增加KV文件上面的方法,你也許可以達到你所要求的..然後決定是否這是走的好方法。

相關問題