Python Kivy Как внедрить виджеты, созданные с помощью Python, в макет в файле kv - PullRequest
0 голосов
/ 10 сентября 2018

Я написал приложение Python Kivy для отображения измерений.В поисках вещей на kivy я наткнулся на проект kivy-md (Material Design for kivy).Я считаю, что интерфейс очень хорошо выглядит.Вот почему я хочу внедрить свое приложение в экран проекта kivy-md.

Мой проект находится в папке kivy-playground, которая содержит kivymd файлы в папке kivymd, main.py (для запуска приложения kivy md), файл main.kv (для макета приложения kivy md) и playground.py, который содержит приложение kivy для отображения измерений.Я использую Python 3.7 с последней версией kivy.

Цель : я хочу добавить представление приложения из 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 основного приложения.

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

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018
  • Если есть файл kv, plays.kv для plays.py , тогда используйте include <file> в main.kv
  • Добавить оператор импорта, from playground import PlayGround в main.py

Директивы Киви Ланга », включая

include <file>

Синтаксис:

#:include [force] <file>

Включает внешний файл KIVY.Это позволяет разбивать сложные виджеты на собственные файлы.Если включение принудительно, файл сначала будет выгружен, а затем снова загружен.

Snippets

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

plays.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:
0 голосов
/ 10 сентября 2018

Если вы можете изменить 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.

...