首页 > 解决方案 > 如何在不使用 Kivy 语言的情况下在另一个布局中使用 Python Kivy RecycleView?

问题描述

我想在不使用 Kivy 语言的情况下在另一个布局中使用RecycleView,但我无法在 Window 上显示数据。我在代码中写错了什么或遗漏了什么?
我知道kv语言很好,但是我不想在这个小项目中使用它。

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview import RecycleView

class MainWidget(FloatLayout):
    def __init__(self):
        super().__init__()
        self.create_layouts()

    def create_layouts(self):
        self.create_recycle_view()

    def create_recycle_view(self):
        recycle_view = RecycleView()
        recycle_view.data = [{'text': str(x)} for x in range(20)]
        recycle_view.viewclass = 'Label'
        recycle_box_layout = RecycleBoxLayout()
        recycle_box_layout.size_hint = (1, 0.2)
        recycle_view.add_widget(recycle_box_layout)
        self.add_widget(recycle_view)

class MainApp(App):
    def build(self):
        return MainWidget()

标签: pythonkivy

解决方案


某些类似乎有一些奇怪的副作用RecycleView,导致viewclass设置为None. 因此,设置viewclass必须晚于您的代码。另外,我认为RecycleView不应该__init__()MainWidget. 因此,基于此,您的代码的修改版本是:

from kivy.app import App
from kivy.clock import Clock
from kivy.metrics import dp
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview import RecycleView


class MainWidget(FloatLayout):

    def create_layouts(self):
        self.create_recycle_view()

    def create_recycle_view(self):
        recycle_box_layout = RecycleBoxLayout(default_size=(None, dp(56)), default_size_hint=(1, None),
                                              size_hint=(1, None), orientation='vertical')
        recycle_box_layout.bind(minimum_height=recycle_box_layout.setter("height"))
        recycle_view = RecycleView()
        recycle_view.add_widget(recycle_box_layout)
        recycle_view.viewclass = 'Label'
        self.add_widget(recycle_view)
        recycle_view.data = [{'text': str(x)} for x in range(20)]


class MainApp(App):
    def build(self):
        Clock.schedule_once(self.add_rv)
        return MainWidget()

    def add_rv(self, dt):
        self.root.create_layouts()


MainApp().run()

此代码使用Clock.schedule_once()(在 的build()方法中App)构建RecycleView. 此外,heightof theRecycleBoxLayout绑定到它的minimum_height属性。


推荐阅读