我正在使用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}
谢谢您的帮助,我是一个初学者,很确定我只忘记阅读文档中的内容。
答案 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}