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