当我从流中收集数据时,我需要刷新循环视图。当我在代码下面运行时,我看到
AttributeError: kivy.properties.DictProperty对象没有属性“requests_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'发布于 2019-02-26 14:20:14
我一直无法测试这个(我没有你的数据库),但我认为它会工作。我认为你关于事例的陈述是正确的。在下面修改的代码中,我将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()作为实例方法调用。同样,这段代码没有经过测试,因此可能会出现一些错误。
https://stackoverflow.com/questions/54885823
复制相似问题