如何在另一个布局中使用Python Kivy RecycleView而不使用Kivy语言?

2024-10-06 13:48:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在另一个布局中使用RecycleView,而不使用Kivy语言,但是我无法在窗口上显示数据。我在代码中写了哪些错误或遗漏了哪些内容?
我知道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()

Tags: fromimportselfboxview语言appdef
1条回答
网友
1楼 · 发布于 2024-10-06 13:48:24

有些RecycleView类似乎有一些奇怪的副作用,导致viewclass被设置为None。因此viewclass的设置必须晚于代码中的设置。此外,我认为RecycleView的构建不应该采用MainWidget__init__()方法。因此,基于此,您的代码的修改版本是:

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()(在Appbuild()方法中)构建RecycleView。另外,RecycleBoxLayoutheight绑定到它的minimum_height属性

相关问题 更多 >