Python Kivy如何将使用Python制作的小部件注入以在kv文件中进行布局

时间:2018-09-10 14:25:47

标签: python python-3.x layout kivy programmatically-created

我已经编写了一个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

2 个答案:

答案 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)

  • 如果存在kv文件,请为 playground.py 使用 playground.kv ,然后在 main.kv <中使用include <file> / li>
  • main.py
  • 中添加导入语句from playground import PlayGround

Kivy Lang Directives » include <file>

include <file>
     

语法:

#:include [force] <file>
     

包括一个外部kivy文件。这使您可以拆分复杂   小部件放入自己的文件中。如果强制包含,文件将   首先要卸载,然后再次重新加载。

摘要

playground.py

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

playground.kv

#:kivy 1.11.0

<PlayGround>:
    text: "Hello World!"

min.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
from playground import PlayGround


class MainApp(App):

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

#:include playground.kv

NavigationLayout:
    ...
        ScreenManager:
            id: scr_mngr
            Screen:
                name: 'page1'
                Label:
                    text: "page1"
            Screen:
                name: 'page2'
                Label:
                    text: "Page 2"
                PlayGround: