【问题标题】:Kivy-Add custom widget definded in py file via kv fileKivy-通过kv文件添加在py文件中定义的自定义小部件
【发布时间】:2020-04-08 15:44:31
【问题描述】:

我有一个自定义按钮。我无法通过 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 的新手,希望有人能提供帮助。

【问题讨论】:

  • 对我来说很好用
  • 嗨@infinityTM,第二个代码可以在你的机器上运行吗?不敢相信????
  • 它只是创建了很多按钮
  • 我将证明这一点作为答案
  • 你想干什么?按钮的滚动视图?

标签: python kivy


【解决方案1】:

当我在 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()

输出是:

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

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

【讨论】:

  • 太棒了!谢谢!顺便说一句,我可以在 kv 文件中指定游侠编号吗?在您的 RecycleApp 代码中是 20。我能不能把它设置成 kv,比如“rangeNumber: 20”?
  • 我不这么认为,我会检查一下
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2012-03-07
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多