通过kv文件在py文件中定义的KivyAdd自定义小部件

2024-06-16 14:15:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个自定义按钮。我不能通过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文件中的按钮是本机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中)

我是新来的,希望有人能帮我


Tags: 文件fromimportselfappbuilderbutton按钮
1条回答
网友
1楼 · 发布于 2024-06-16 14:15:37

当我在Kivyv1.11.1上运行代码时,Pythonv3.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

相关问题 更多 >