在 Kivy 中使用构建器

Using builder in Kivy

我想创建一个简单的应用程序,它有一个带有按钮的 GUI,可以让我振动 android phone。我在我的 .yp 文件中使用 .kv 文件作为布局和 Builder

.py 文件:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
from plyer import vibrator


class AndroidApp(GridLayout):
    def vibrate(self):
        vibrator.vibrate()


kv = Builder.load_file("android_app.kv")


class MainApp(App):
    def build(self):
        return kv


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

.kv 文件:

#:import utils kivy.utils
<AndroidApp>:
    FloatLayout:
        canvas.before:
            Color:
                rgb: utils.get_color_from_hex("#ffffff")
            Rectangle:
                size: self.size
                pos: self.pos
        GridLayout:
            rows: 1
            cols: 2
            Label:
                text:"Android Vibrate"

            Button:
                text:"Android Vibrate"
                on_press:
                    root.vibrate()

当我尝试 运行 应用程序时,出现以下错误:

enter image description here

这应该是一个简单的应用程序,但不知何故我找到了让它崩溃的方法。 android_app.py & .kv 文件位于同一文件夹中。为什么 window 不会被创建?我很感激任何帮助。 谢谢, 亚历克斯

您必须 return 主要 class,而不是构建的结果。这里我为了方便使用了Builder.load_string(),并没有引入player,除此之外唯一实质性的变化是我将return kv改为了return AndroidApp()

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder

KV = '''
#:import utils kivy.utils
<AndroidApp>:
    FloatLayout:
        canvas.before:
            Color:
                rgb: utils.get_color_from_hex("#ffffff")
            Rectangle:
                size: self.size
                pos: self.pos
        GridLayout:
            rows: 1
            cols: 2
            Label:
                text:"Android Vibrate"

            Button:
                text:"Android Vibrate"
                on_press:
                    root.vibrate()
'''

class AndroidApp(GridLayout):
    def vibrate(self):
        vibrator.vibrate()


Builder.load_string(KV)


class MainApp(App):
    def build(self):
        return AndroidApp()


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