当我从流接收数据时,我需要刷新回收视图。当我在代码下面运行时,我看到
AttributeError: 'kivy.properties.DictProperty' object has no attribute '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()
你知道吗主电源.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'
我还没有能够测试这个(我没有你的数据库),但我认为它会工作。我认为你关于实例的说法是对的。在下面修改的代码中,我将
setRequestTab
更改为实例方法:我在
StreamApp
中保存了对RequestScreen
的引用,然后在stream_handler()
中使用了该引用。这允许我将setRequestTab()
作为实例方法调用。同样,此代码未经测试,因此可能存在一些错误。你知道吗相关问题 更多 >
编程相关推荐