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

时间:2020-08-29 17:22:25

标签: python kivy kivy-language

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

我现在的问题是我无法弄清楚如何使其在我的.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}

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

1 个答案:

答案 0 :(得分:1)

首先,您需要退还给您的Screenmanager。它检查您的屏幕和儿童屏幕。因此,如果您想使用Screenmanager,请像我一样将其返回到您的App类。之后,kivy小部件没有构建功能。如果创建的功能不在小部件自身的功能中,则需要调用此功能的名称来运行其自身的命令。实际上,您不应该这样创建窗口小部件。您可以使用Screen的功能,例如: on_enter 。您可以单击任意按钮来创建此按钮,也可以使用带有kivy功能的Clock函数来创建计时器。我选择了on_enter方法。因此我更改了设计。在下面检查此最小代码。 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}