Odświeżenie widoku w Kivy. Streaming.

Odpowiedz Nowy wątek
2019-02-26 08:36
0

W jaki sposób po przyjściu danych ze streamingu wymusić odświeżenie widoku w kivy? Poniższy kod działa, widać wszystkie printy, tablica zmienia zawartość ale nie wiem jak wymusić odświeżenie aby nowy wpis pojawił się w recycleview. PróbowałemClock.schedule, próbowałem w metodzie recycle_view_list przypisać nowe dane przez self.ids.requests_recycle_view.data = listFromStream ale nic się nie wyświetla.

main.py

from kivy.config import Config
Config.set('graphics', 'multisamples', '0')
from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
import pyrebase
from kivy.properties import  ListProperty

config = {
    "apiKey": "String",
    "authDomain": "String",
    "databaseURL": "String",
    "projectId": "String",
    "storageBucket": "String",
    "messagingSenderId": "String"
  };

firebase = pyrebase.initialize_app(config)
db = firebase.database()

Builder.load_file('kv/main.kv')

#-------------------------------------------------------------ScreenManager

class ScreenManagement(ScreenManager):
    pass

#--------------------------------------------------------------RequestScreen

class RequestScreen(Screen):

    requests_tab =  ListProperty()

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def recycle_view_list(self, listFromStream):
        print("recycle_view_list", listFromStream)

        self.requests_tab = listFromStream
        #self.ids.requests_recycle_view.data = listFromStream

    @classmethod
    def setRequestTab(cls, tab):
        print("setRequestTab", tab)
        cls.recycle_view_list(RequestScreen ,tab)

# ------------------------------------------------------------stream_handler
def stream_handler(message):
    print(message["event"])  # put
    print(message["path"])  # /-K7yGTTEp7O549EzTYtI
    print(message["data"])  # {'title': 'Pyrebase', "body": "etc..."}

    pyreMessage = [{'text': message["data"]}]

    RequestScreen.setRequestTab(pyreMessage)

db.child("Requests").stream(stream_handler)

#---------------------------------------------------------------StreamApp
class StreamApp(App):
    def build(self):

        sm = ScreenManagement()
        sm.add_widget(RequestScreen(name="Bajot II"))
        return sm

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

main.kv

#main.kv
#:import FadeTransition kivy.uix.screenmanager.FadeTransition

<ScreenManagement>:
    transition: FadeTransition()
    RequestScreen:

<[email protected]>
    halign: 'right'
    valign: 'middle'
    width: 80

<RequestScreen>
    name: "RequestScreen"

    requests_tab:      requests_recycle_view.data

    BoxLayout:
        #size_hint_y: None

        RecycleView:
            id: requests_recycle_view
            viewclass: 'CustLabel'
            #data: root.requests_tab
            RecycleBoxLayout:
                spacing: 15
                default_size: 100, dp(25)
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'

Pozostało 580 znaków

2019-02-26 13:47
0

Gdy do request_recycle_view dodam self.ids.requests_recycle_view.data = self.requests_tab wyrzuca błąd AttributeError: 'kivy.properties.DictProperty' object has no attribute 'requests_recycle_view'. Czemu tak się dzieje? Gdy dopisałem do main.kv Button i wyzwlałem tę funkcję to lista się odświeżała. Ta sama linia kodu wyzwalana przez stream wyrzuca błąd.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0