在 .kv 文件中使用 python 中制作的 kivy 小部件

Use kivy widget made in python in .kv file

我正在 Python 开发一个 kivy 应用程序。 UI 的所有代码都写在 KV 文件中。 我现在有一个非常复杂的小部件,我想在 .py 文件中设计它。

我现在的问题是我不知道如何让它在我的 .kv 文件中可用。 我提供了一个问题示例:

我的 Python 文件:

    #main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button

class MyApp(App):
    pass

class WindowManager(ScreenManager):
    pass

class MainWindow(Screen):
    pass

class KvWidget(Widget):
    pass

class PythonWidget(Widget):
    def build(self):
        layout = FloatLayout(size=(self.width, self.height))
        test_button = Button(text = "Test button made in PY file",
                             size_hint = (1, .5),
                             pos_hint = {"x": 0, "top": .5})
        layout.add_widget(test_button)
        return layout

if __name__ == "__main__":
    MyApp().run()

还有我的“my.kv”Kivy 文件:

#my.kv

WindowManager:
    MainWindow:

<MainWindow>:
    KvWidget:
    PythonWidget:


<KvWidget>:
    FloatLayout:
        size: root.width, root.height

        Button:
            text: "Test Button made in KV file"
            size_hint: 1, .5
            pos_hint: {"x": 0, "top": 1}

感谢您的所有帮助,我是初学者,很确定我只是忘了阅读文档中的内容。

首先,您需要为 Screenmanager.It 检查屏幕提供 return,childrens.So 如果您想使用 Screenmanager,return 它在您的应用程序 class 就像我一样。在那之后,kivy widgets 没有 build function.If 你创建的函数没有在 widget 自己的函数中,你需要调用这个函数的名称 运行 它自己的命令。实际上你不应该像这样创建你的小部件 way.You 可以像这样使用屏幕的功能:on_enter。你可以通过任何点击创建这个按钮,或者使用计时器kivy中的时钟功能。我选择了 on_enter method.So 我改变了你的设计。检查下面的最小代码。main.py:

#Main.py:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.widget import Widget
from kivy.uix.button import Button
class WindowManager(ScreenManager):
    pass
class MainWindow(Screen):
    def on_enter(self, *args):
        self.add_widget(Button(text="Test button made in PY file",size_hint=(1, .5),pos_hint={"x": 0, "top": .5}))
class KvWidget(Widget):
    pass
class MyApp(App):
    def build(self):
        return WindowManager()
if __name__ == "__main__":
    MyApp().run()

my.kv:

<WindowManager>:
    MainWindow:
<MainWindow>:
    KvWidget:
<KvWidget>:
    FloatLayout:
        size: root.width, root.height

        Button:
            text: "Test Button made in KV file"
            size_hint: 1, .5
            pos_hint: {"x": 0, "top": 1}