首页 > 解决方案 > 在 .kv 文件中使用用 python 制作的 kivy 小部件

问题描述

我正在用 Python 开发一个 kivy 应用程序。我所有的 UI 代码都写在一个 KV 文件中。我现在有一个非常复杂的 Widget,我想在 .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}

谢谢你的每一个帮助,我是一个初学者,我很确定我只是忘了阅读文档中的一些内容。

标签: pythonkivykivy-language

解决方案


首先,您需要返回您的 Screenmanager。它会检查您的屏幕和子项。因此,如果您想使用 Screenmanager,请像我一样在您的 App 类中返回它。之后,kivy小部件没有构建功能。如果您创建的功能在小部件自己的功能中没有,您需要调用该功能的名称来运行它自己的命令。实际上你不应该这样创建你的小部件。你可以使用 Screen 的功能,就像:on_enter。你可以通过任何点击创建这个按钮,或者用 kivy 中的时钟功能创建计时器。我选择了 on_enter 方法。所以我改变了你的设计。检查下面的这个最小代码。主要.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()

我的.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}

推荐阅读