我已经编写了一个python kivy应用程序来显示测量值。在搜索kivy上的东西时,我偶然发现了kivy-md(用于kivy的材料设计)项目。我发现用户界面很好看。这就是为什么我要将我的应用程序注入kivy-md项目的屏幕。
我的项目位于文件夹kivy-playground
中,其中包含kivymd
文件夹中的kivymd
个文件,main.py
(用于启动kivy md应用程序),{{ 1}}文件(用于kivy md应用程序的布局)和一个main.kv
,其中包含用于显示测量值的kivy应用程序。我正在将Python 3.7与最新版本的kivy一起使用。
目标:我想将
playground.py
中的“应用程序”视图注入到由playground.py
启动的主应用程序中,main.py
的视图显示在屏幕playground.py
上 (请参见page2
)。我完全迷路了 可以实现,如果有人可以告诉我,我会很高兴 玩具示例如何实现。main.kv
保持原样并不重要。如果可以通过playground.py
文件中的较小更改来解决问题,那么这也是一种有效的解决方案。
我试图制作一个最小的工作示例。这是文件
playground.py
这是# main.py
# -*- coding: utf-8 -*-
import os
from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivymd.theming import ThemeManager
class MainApp(App):
theme_cls = ThemeManager()
def __init__(self, **kwargs):
super(MainApp, self).__init__(**kwargs)
Window.bind(on_close=self.on_stop)
def build(self):
main_widget = Builder.load_file(
os.path.join(os.path.dirname(__file__), "./main.kv")
)
self.theme_cls.theme_style = 'Dark'
return main_widget
def close_app(self, *largs):
super(MainApp, self).stop(*largs)
def on_pause(self):
return True
if __name__ == '__main__':
MainApp().run()
main.kv
这是我要注入到主应用程序屏幕# main.kv
#:kivy 1.10.1
#:import Toolbar kivymd.toolbar.Toolbar
#:import MDNavigationDrawer kivymd.navigationdrawer.MDNavigationDrawer
#:import NavigationLayout kivymd.navigationdrawer.NavigationLayout
#:import NavigationDrawerToolbar kivymd.navigationdrawer.NavigationDrawerToolbar
NavigationLayout:
id: nav_layout
MDNavigationDrawer:
id: nav_drawer
NavigationDrawerToolbar:
NavigationDrawerIconButton:
icon: 'checkbox-blank-circle'
text: "Page1"
on_release: app.root.ids.scr_mngr.current = 'page1'
NavigationDrawerIconButton:
icon: 'checkbox-blank-circle'
text: "Page2"
on_release: app.root.ids.scr_mngr.current = 'page2'
BoxLayout:
orientation: 'vertical'
halign: "center"
Toolbar:
id: toolbar
md_bg_color: app.theme_cls.primary_color
background_palette: 'Primary'
background_hue: '500'
right_action_items: [['dots-vertical', lambda x: app.root.toggle_nav_drawer()]]
ScreenManager:
id: scr_mngr
Screen:
name: 'page1'
Label:
text: "page1"
Screen:
name: 'page2'
Label:
text: "Page 2"
中的playground.py
。
page2
答案 0 :(得分:1)
如果您可以将Playground.py
更改为以下内容:
from kivy.app import App
from kivy.uix.label import Label
def getPlaygroundRoot():
hello_world_label = Label(text="Hello World!")
return hello_world_label
class PlayGround(FloatLayout):
def __init__(self, **kwargs):
super(PlayGround, self).__init__(**kwargs)
self.add_widget(getPlaygroundRoot())
class Playground(App):
def build(self):
return getPlaygroundRoot()
if __name__ == "__main__":
Playground().run()
然后,在您的main.py
中,您可以添加:
from playGround import getPlaygroundRoot
然后使用add_widget(getPlaygroundRoot())
将Playground
根添加到MainApp
中的某个容器中。
或者,如果您想在Playground
文件中使用.kv
,则可以添加
#:import playground playGround
到您的.kv
文件中,然后添加:
Screen:
name: 'page2'
Label:
text: "Page 2"
pos_hint: {'center_x': 0.5, 'y': 0.8}
size_hint: (1.0, 0.2)
PlayGround:
pos_hint: {'center_x': 0.5, 'y': 0.1}
size_hint: (1.0, 0.2)
将其添加到您的page2
。
答案 1 :(得分:1)
include <file>
/ li>
from playground import PlayGround
Kivy Lang Directives » include <file>
include <file>
语法:
#:include [force] <file>
包括一个外部kivy文件。这使您可以拆分复杂 小部件放入自己的文件中。如果强制包含,文件将 首先要卸载,然后再次重新加载。
from kivy.app import App
from kivy.uix.label import Label
class PlayGround(Label):
pass
class Playground(App):
def build(self):
return PlayGround()
if __name__ == "__main__":
Playground().run()
#:kivy 1.11.0
<PlayGround>:
text: "Hello World!"
# main.py
# -*- coding: utf-8 -*-
import os
from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivymd.theming import ThemeManager
from playground import PlayGround
class MainApp(App):
# main.kv
#:kivy 1.10.1
#:import Toolbar kivymd.toolbar.Toolbar
#:import MDNavigationDrawer kivymd.navigationdrawer.MDNavigationDrawer
#:import NavigationLayout kivymd.navigationdrawer.NavigationLayout
#:import NavigationDrawerToolbar kivymd.navigationdrawer.NavigationDrawerToolbar
#:include playground.kv
NavigationLayout:
...
ScreenManager:
id: scr_mngr
Screen:
name: 'page1'
Label:
text: "page1"
Screen:
name: 'page2'
Label:
text: "Page 2"
PlayGround: