python - 在 .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}
谢谢你的每一个帮助,我是一个初学者,我很确定我只是忘了阅读文档中的一些内容。
解决方案
首先,您需要返回您的 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}
推荐阅读
- powershell - 为了使用 powershell 重置 MFA,我的用户应该具有什么角色?
- routes - HERE标准项目为什么要空地图?
- c# - 试图在 url 中传递 base64url 编码的令牌,但它一直失败
- c# - 返回列表的前 50%,同时在对象属性之间平均拆分行
- django - django - 在创建视图中迭代模型并返回内联表单集
- laravel-backpack - 会话语言环境背包
- python-3.x - 创建子类的对象时出现问题
- virtual-machine - 将两种不同大小的vmdk文件转换为qcow2文件
- java - 扩展 CrudRepository (Spring) 时是否需要 @Repository 注释?
- pointers - llvm:创建结构类型数组(指针)