我想爲每個屏幕分別提供.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
對於程序中的每個屏幕,有兩個源文件會使擴展和管理變得更加困難,而不是更少。另外,您能向我們展示一些您開始使用的代碼,以及您在完成此操作時所做的任何嘗試嗎? – TigerhawkT3
我已編輯我的帖子。 – user2534685
你可以把類放在單獨的文件中,只需要'''導入''它們在主? – bj0