我想为每个屏幕创建一个单独的 .py 和 .kv 文件。在 main.py/main.kv 中的 ScreenManager 上,应该选择屏幕。设计应该从文件 screen_X.kv 加载,类等应该从文件 screen_X.py 加载。
屏幕:
文件:
这使得程序可以很容易地扩展。我怎样才能做到这一点?
使用此代码,我分离了 .kv 文件。但我还需要单独的 .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()
Run Code Online (Sandbox Code Playgroud)
展示.kv
#:kivy 1.8.0
#:import KivyLexer kivy.extras.highlight.KivyLexer
#:import Factory kivy.factory.Factory
<ActionSpinnerOptions@SpinnerOption>
background_color: .4, .4, .4, 1
<ActionSpinner@Spinner+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
Run Code Online (Sandbox Code Playgroud)
首先,你没有提到你是否知道如何以通常的方式设置不同的屏幕,我不确定我在上面的代码中看到了它。如果你不知道,这里有一个相当简单的教程来创建一个简单的多屏幕设置。
每个屏幕都是一个继承自 的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')
Run Code Online (Sandbox Code Playgroud)
因此,通过将您的屏幕类导入您的 main.py 并使用上述添加 kv 文件的方法,您可能会实现您的要求......然后决定这是否是一个好方法。
| 归档时间: |
|
| 查看次数: |
2157 次 |
| 最近记录: |