DictProperty не имеет атрибута "reports_recycle_view". питон

Мне нужно обновить представление корзины, когда я получаю данные из потока. Когда я бегу ниже кода, я вижу

AttributeError: у объекта 'kivy.properties.DictProperty' нет атрибута 'reports_recycle_view'

Это происходит от методаrecycle_view_list Я думаю, что есть некоторые проблемы с экземплярами, но не могу решить их. Когда я комментирую self.ids.requests_recycle_view.data = self.requests_tab и беги refresh_recycle_view от кнопки это работает - я имею в виду, что это обновляет список на экране, но мне нужно, чтобы он запускался автоматически, когда данные в requests_tab изменения из потока.

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 refresh_recycle_view(self):
        print('refresh',  self.requests_tab)
        self.ids.requests_recycle_view.data = self.requests_tab


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

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

    @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:

<CustLabel@Label>
    halign: 'right'
    valign: 'middle'
    width: 80

<RequestScreen>
    name: "RequestScreen"

    requests_tab:   requests_recycle_view.data


    Button:
        size_hint_x: None
        width: 42
        text: "Done"
           on_press:   root.refresh_recycle_view()



    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'

1 ответ

Я не смог проверить это (у меня нет вашей базы данных), но я думаю, что это сработает. Я думаю, что ваше утверждение о случаях является правильным. В измененном коде ниже я изменил setRequestTab к методу экземпляра:

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 refresh_recycle_view(self):
        print('refresh',  self.requests_tab)
        print(self.ids.requests_recycle_view)
        self.ids.requests_recycle_view.data = self.requests_tab


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

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

    def setRequestTab(self, tab):
        print("setRequestTab", tab)
        self.recycle_view_list(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"]}]

    App.get_running_app().requestScreen.setRequestTab(pyreMessage)



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




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

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

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

Я сохранил ссылку на RequestScreen в StreamApp, а затем использовал эту ссылку в stream_handler(), Это позволяет мне позвонить setRequestTab() как метод экземпляра. Опять же, этот код не проверен, поэтому могут быть некоторые ошибки.

Другие вопросы по тегам