如何在 kv 语言上使用 Kivy 的 RecycleView 与 ScreenManager 一起使用?



我在谷歌Firebase上有一个数据库运行良好,我可以轻松地将我的数据保存在那里。我想为我的应用程序返回此数据,但在遇到此问题之前,我无法在 Kivy 上列出任何内容。

我想使用Kivy的ListView,但在文档中建议使用RecycleView。但我无法理解文档。我有些怀疑。

如果您可以阅读RecycleView的文档,您将看到以下示例:

Builder.load_string('''
<RV>:
viewclass: 'Label'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
''')
class RV(RecycleView):
def __init__(self, **kwargs):
super(RV, self).__init__(**kwargs)
self.data = [{'text': str(x)} for x in range(100)]

class TestApp(App):
def build(self):
return RV()
if __name__ == '__main__':
TestApp().run()

但是我正在使用屏幕管理器来控制我的屏幕,然后,在 TestApp 类中,我返回"sm",如以下文档示例:

# Declare both screens
class MenuScreen(Screen):
pass
class SettingsScreen(Screen):
pass
# Create the screen manager
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))
class TestApp(App):
def build(self):
return sm
if __name__ == '__main__':
TestApp().run()

如果你看到语法不同,在这里我不知道如何编码。我想继续使用屏幕管理器来控制屏幕,并使用RecycleView在列表中返回我的数据。

如何在我的屏幕管理器中使用回收视图?这是我的 main.py,我在另一个文档中配置屏幕,我也使用 ki 语言。因此,如果你们都能为我做一个榜样,我将不胜感激。

import kivy
from kivy.app import App, Builder
from kivy.config import Config
from kivy.uix.screenmanager import ScreenManager
from telas.telas import Acesso, Comprando, Vendendo, CadastrarEvento

kivy.require('1.10.1')
Builder.load_file('ing.kv')
Config.read('config.ini')
sm = ScreenManager()
sm.add_widget(Acesso(name='acesso'))
sm.add_widget(Comprando(name='comprando'))
sm.add_widget(Vendendo(name='vendendo'))
sm.add_widget(CadastrarEvento(name='cadastrarEvento'))
sm.add_widget(ListaEventos(name='listaEventos'))
class IngApp(App):
def build(self):
return sm
if __name__ == '__main__':
IngApp().run()

这是我第一次尝试的kv

<ListaEventos>:
canvas:
Rectangle:
source: 'design/fundo.png'
size: self.width, self.height    

viewclass: 'Label'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'

ListaEventos:

class ListaEvento(Screen, RecycleView):
def __init__(self, **kwargs):
super(ListaEvento, self).__init__(**kwargs)
self.data = [{'text': str(x)} for x in range(20)] 

你不应该从 2 个小部件继承,但要绘制什么小部件?例如,如果想要一个行为类似于按钮的图像,则必须从"图像"小组件和 ButtonBehavior 类继承,也就是说,在视觉上它是一个图像,但添加了按钮行为。

因此,要解决您的问题,使用继承而不是组合是不正确的,即将RecyclerView添加为屏幕的儿子。

*。.py

import kivy
from kivy.app import App, Builder
from kivy.config import Config
from kivy.uix.screenmanager import ScreenManager, Screen
class ListaEventos(Screen):
def __init__(self, **kwargs):
super(ListaEventos, self).__init__(**kwargs)
# assigning data in RecyclerView
self.rv.data = [{'text': str(x)} for x in range(100)]

kivy.require('1.10.1')
Builder.load_file('ing.kv')
Config.read('config.ini')
sm = ScreenManager()
sm.add_widget(ListaEventos(name='listaEventos'))

class IngApp(App):
def build(self):
return sm

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

英.KV

<ListaEventos>:
rv: rv # expose the widget
canvas:
Rectangle:
source: 'design/fundo.png'
size: self.width, self.height
RecycleView:
id: rv
viewclass: 'Label'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'

最新更新