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

问题描述 投票:0回答:2

我写了一个python kivy应用程序来显示测量值。在kivy上搜索东西时,我偶然发现了kivy-md(Material Design for kivy)项目。我发现用户界面非常好看。这就是为什么我想将我的应用程序注入kivy-md项目的屏幕。

我的项目位于文件夹kivy-playground中,其中包含文件夹kivymd中的kivymd文件,main.py(用于启动kivy md应用程序),main.kv文件(用于kivy md应用程序的布局)和包含kivy应用程序的playground.py显示测量值。我正在使用Python 3.7和最新版本的kivy。

目标:我想将playground.py的Application视图注入由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

from kivy.app import App
from kivy.uix.label import Label


class Playground(App):

    def build(self):
        hello_world_label = Label(text="Hello World!")
        return hello_world_label


if __name__ == "__main__":
    Playground().run()
python python-3.x layout kivy programmatically-created
2个回答
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
投票
  • 如果有一个kv文件,playground.kv为playground.py然后在main.kv中使用include <file>
  • 在main.py中添加import语句from playground import PlayGround

Kivy Lang Directives » include <file>

include <file>

句法:

#:include [force] <file>

包括外部kivy文件。这允许您将复杂的小部件拆分为自己的文件。如果强制包含,则首先卸载该文件,然后重新加载。

Snippets

playground.朋友

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!"

民.朋友

# 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:
© www.soinside.com 2019 - 2024. All rights reserved.