Как я могу использовать RecycleView Kivy на языке kv с ScreenManager? - PullRequest
0 голосов
/ 11 сентября 2018

У меня хорошо работает база данных на Firebase от Google, я могу легко сохранять там свои данные. Я хотел бы вернуть эти данные для моего приложения, но, прежде чем у меня возникнут проблемы с этим, я не могу ничего перечислить в Kivy.

Я бы хотел использовать ListView от Kivy, но в документации рекомендуется использовать RecycleView. Но я не могу понять документацию. У меня есть некоторые сомнения.

Если вы можете прочитать документы RecycleView , вы увидите это в качестве примера:

Builder.load_string('''
<RV>:
    viewclass: 'Label'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
''')

class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(100)]


class TestApp(App):
    def build(self):
        return RV()

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

Но я использую ScreenManager для управления моими экранами, затем в классе TestApp я возвращаю 'sm', как в этом примере документации:

# Declare both screens
class MenuScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

# Create the screen manager
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))

class TestApp(App):
    def build(self):
        return sm

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

Если вы видите, что синтаксис отличается, и я здесь не знаю, как это кодировать. Я хотел бы продолжать использовать ScreenManager для управления экранами и использовать RecycleView для возврата моих данных в список.

Как я могу использовать RecycleView с моим ScreenManager? Это мой main.py, я настраиваю экран в другом документе и тоже использую язык ки. Так что, если вы все можете сделать пример для меня, я буду благодарен.

import kivy
from kivy.app import App, Builder
from kivy.config import Config
from kivy.uix.screenmanager import ScreenManager
from telas.telas import Acesso, Comprando, Vendendo, CadastrarEvento


kivy.require('1.10.1')
Builder.load_file('ing.kv')
Config.read('config.ini')
sm = ScreenManager()

sm.add_widget(Acesso(name='acesso'))
sm.add_widget(Comprando(name='comprando'))
sm.add_widget(Vendendo(name='vendendo'))
sm.add_widget(CadastrarEvento(name='cadastrarEvento'))
sm.add_widget(ListaEventos(name='listaEventos'))

class IngApp(App):
    def build(self):
        return sm

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

Вот кв, который я пробовал в первый раз

<ListaEventos>:
    canvas:
        Rectangle:
            source: 'design/fundo.png'
            size: self.width, self.height    


    viewclass: 'Label'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'

ListaEventos:

class ListaEvento(Screen, RecycleView):
    def __init__(self, **kwargs):
        super(ListaEvento, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(20)] 

1 Ответ

0 голосов
/ 11 сентября 2018

Вы не должны наследовать от 2 виджетов, но какой виджет будет нарисован? Например, если вам нужно изображение, которое ведет себя как кнопка, вы должны наследовать от виджета Image и класса ButtonBehavior, то есть визуально это изображение, но добавленное поведение кнопки.

Таким образом, для решения вашей проблемы не правильно использовать наследование, а композицию, то есть добавлять RecyclerView в качестве сына экрана.

*. Py

import kivy
from kivy.app import App, Builder
from kivy.config import Config
from kivy.uix.screenmanager import ScreenManager, Screen

class ListaEventos(Screen):
    def __init__(self, **kwargs):
        super(ListaEventos, self).__init__(**kwargs)
        # assigning data in RecyclerView
        self.rv.data = [{'text': str(x)} for x in range(100)]


kivy.require('1.10.1')
Builder.load_file('ing.kv')
Config.read('config.ini')

sm = ScreenManager()
sm.add_widget(ListaEventos(name='listaEventos'))


class IngApp(App):
    def build(self):
        return sm


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

ing.kv

<ListaEventos>:
    rv: rv # expose the widget

    canvas:
        Rectangle:
            source: 'design/fundo.png'
            size: self.width, self.height

    RecycleView:
        id: rv
        viewclass: 'Label'
        RecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...