Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Kivy如何将用Python制作的小部件注入到kv文件中的布局中_Python_Python 3.x_Layout_Kivy_Programmatically Created - Fatal编程技术网

Python Kivy如何将用Python制作的小部件注入到kv文件中的布局中

Python Kivy如何将用Python制作的小部件注入到kv文件中的布局中,python,python-3.x,layout,kivy,programmatically-created,Python,Python 3.x,Layout,Kivy,Programmatically Created,我已经编写了一个用于显示测量值的python kivy应用程序。在寻找关于kivy的资料时,我偶然发现了kivy md(kivy材料设计)项目。我觉得UI非常好看。这就是为什么我想将我的应用程序注入kivy md项目的屏幕 我的项目位于一个文件夹kivy playerd中,其中包含kivymd文件夹中的kivymd文件、main.py(用于启动kivy md应用程序)、main.kv文件(用于kivy md应用程序的布局)还有一个playway.py,其中包含用于显示测量值的kivy应用程序。我

我已经编写了一个用于显示测量值的python kivy应用程序。在寻找关于kivy的资料时,我偶然发现了kivy md(kivy材料设计)项目。我觉得UI非常好看。这就是为什么我想将我的应用程序注入kivy md项目的屏幕

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

Goal:我想将
playdry.py
中的应用程序视图注入由
main.py
启动的主应用程序中,以便
playerd.py的视图显示在屏幕
page2
(参见主应用的
main.kv
)。我完全不知道这是怎么回事 如果有人能告诉我这一点,我会很高兴的 举例说明如何实现这一点。
playerd.py
保持原样并不一定重要。如果这个问题可以通过对
playway.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"
这里是
playway.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()

如果您可以将
playway.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_小部件(getPlaygroundRoot())
playdry
根添加到
MainApp
中的某个容器中

或者,如果要在
.kv
文件中使用
游乐场
,可以添加
#:将游乐场
导入您的
.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

中,请将
playerd.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_小部件(getPlaygroundRoot())
playdry
根添加到
MainApp
中的某个容器中

或者,如果要在
.kv
文件中使用
游乐场
,可以添加
#:将游乐场
导入您的
.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)
将其添加到您的
页面2

  • 如果存在kv文件,请将playery.kv用作playery.py,然后在main.kv中使用
    include
  • 在main.py中添加import语句,
    来自playerly import playerly

万伏 主电压(千伏)
  • 如果存在kv文件,请将playery.kv用作playery.py,然后在main.kv中使用
    include
  • 在main.py中添加import语句,
    来自playerly import playerly

万伏 主电压(千伏)
我怀疑试图让两个应用程序在同一个窗口中运行会导致很多问题。只需将
游乐场
应用程序中的根小部件插入到原始应用程序中就会容易得多。它不必与第二个应用程序一起,但我不知道如何更改playway.py,以便将其注入到
main.kv
page2
中。我怀疑尝试在同一窗口中运行两个应用程序会导致很多问题。只需将根小部件从
playway
应用程序插入到原始应用程序中就会容易得多。它不必与第二个应用程序一起使用,但我不知道如何更改playway.py,以便将其插入
main.kv
page2
。谢谢您的回答!我会尝试一下,如果成功的话,我会接受答案。谢谢!它就像一个符咒!我花了一些时间才弄明白如何重构应用程序,但您的示例是理解如何实现它的关键。谢谢您的回答!我会尝试一下,如果成功的话,我会接受答案。谢谢!它就像一个符咒!我花了一些时间才弄明白如何重构应用程序,但您的示例是理解如何实现它的关键。谢谢您的回答。问题是,我的全部代码都是用python编写的。我没有在
playerd.py
中使用任何kv文件。谢谢您的回答。问题是,我的全部代码都是用python编写的。我没有为
playway.py
使用任何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
#: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: