Kivy-通过KV文件在py文件中定义自定义小部件

时间:2020-04-08 15:44:31

标签: python kivy

我有一个自定义按钮。我无法通过kv文件将其显示在屏幕上。我研究了很多话题。找不到有用的信息。这是一个简单的示例:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string('''
#:kivy 1.11.0

<MyGrid>:
    Button
        text: 'hello'
''')

class MyGrid(BoxLayout):
    pass

class DropApp(App):
    def build(self):
        return MyGrid()

if __name__ == '__main__':
    DropApp().run()

请注意,此kv文件中的Button是本机Kivy按钮。我运行此代码,我可以在屏幕上看到此按钮。但是现在我有了一个自定义按钮:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string('''
#:kivy 1.11.0

<MyGrid>:
    customButton:
''')

class MyGrid(BoxLayout):
    pass

class customButton(Button):
    def __init__(self, **kwargs):
        self.text = 'hi'
        super(Button, self).__init__(**kwargs)

class DropApp(App):
    def build(self):
        return MyGrid()

if __name__ == '__main__':
    DropApp().run()

我运行此代码,但无法在屏幕上看到此customButton。请注意,自定义窗口小部件很复杂。我必须在py文件中定义它。例如:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout

class DropApp(App):
    def build(self):

        layout = GridLayout(cols=1, spacing=10)
        for i in range(100):
            btn = Button(text=str(i), size_hint_y=None, height=40)
            layout.add_widget(btn)
        return layout

if __name__ == '__main__':
    DropApp().run()

构建此布局需要循环。我找不到在kv文件中构建它的方法。所以我在Py文件中定义它。但是,如果我在py文件中定义它,则无法在kv文件中使用它。

问题1:第二个代码出了什么问题?

问题2:如果我无法使其工作,是否可以在kvlang中实现第三个代码(在kv文件中而不在python中)?

我是Kivy的新手,希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

当我在Kivy v1.11.1上运行代码时,Python v3.7.5

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout

class DropApp(App):
    def build(self):

        layout = GridLayout(cols=1, spacing=10)
        for i in range(100):
            btn = Button(text=str(i), size_hint_y=None, height=40)
            layout.add_widget(btn)
        return layout

if __name__ == '__main__':
    DropApp().run()

输出为:

output

如果这是您需要的输出,请尝试运行:

pip install --upgrade kivy

对于第二个代码,python区分大小写。因此,请使用customButton而不是CustomButton


如果您要使用.kv文件执行第三个代码,请参见以下示例:

from kivy.app import App

from kivy.uix.recycleview import RecycleView

from kivy.lang import Builder

Builder.load_string('''

<ExampleRV>:

    viewclass: 'Button'

    RecycleBoxLayout:

        size_hint_y: None

        height: self.minimum_height

        orientation: 'vertical'

''')

class ExampleRV(RecycleView):

    def __init__(self, **kwargs):

        super(ExampleRV, self).__init__(**kwargs)

        self.data = [{'text': str(x)} for x in range(20)]

class RecycleApp(App):

    def build(self):

        return ExampleRV()

RecycleApp().run()

请参考HERE