Python Kivy如何将用Python制作的小部件注入到kv文件中的布局中
我已经编写了一个用于显示测量值的python kivy应用程序。在寻找关于kivy的资料时,我偶然发现了kivy md(kivy材料设计)项目。我觉得UI非常好看。这就是为什么我想将我的应用程序注入kivy md项目的屏幕 我的项目位于一个文件夹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应用程序。我
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: