Kivy-Добавить пользовательский виджет, определенный в py-файле через файл kv - PullRequest
1 голос
/ 08 апреля 2020

У меня есть пользовательская кнопка. Я не могу поставить его на экран через файл 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()

Я запускаю этот код, я не вижу эту пользовательскую кнопку на экране. Обратите внимание, что пользовательский виджет сложен. Я должен определить это в 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()

Для построения этого макета необходимо l oop. Я не могу найти способ построить его в файл kv. Поэтому я определяю это в Py-файле. Но если я определю это в py-файле, я не смогу работать с ним в kv-файле.

Вопрос 1. Что не так со вторым кодом?

Вопрос 2: Если я не могу заставить его работать, могу ли я получить третий код в kvlang (в файле kv нет в python)?

Я новичок в Киви, надеюсь, кто-то может помочь.

1 Ответ

0 голосов
/ 08 апреля 2020

Когда я запускаю код на 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()

Для справки , go ЗДЕСЬ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...