Python 3.x Kivy RecycleView作为ListView的替代品?它是如何工作的?

Python 3.x Kivy RecycleView作为ListView的替代品?它是如何工作的?,python-3.x,kivy,kivy-language,Python 3.x,Kivy,Kivy Language,我应该说,我还是Kivy的新手。 我试着寻找类似的问题,但它们要么过时了,要么不清楚 我正在寻找一些东西来显示元素列表,其中一个用户可以选择一个与其他小部件按钮交互,等等。 我无意中发现了,但它明确指出ListView已被弃用,必须改用它 现在的问题是,至少对我来说,文档似乎不太清楚如何使用RecycleView。它肯定比其他小部件更复杂,我似乎无法理解 要将其分解为更容易理解的问题: 1.如何定义作为项目列表的RecycleView? 2.如何为其提供项目? 3.我如何与它交互,特别是一次只选

我应该说,我还是Kivy的新手。 我试着寻找类似的问题,但它们要么过时了,要么不清楚

我正在寻找一些东西来显示元素列表,其中一个用户可以选择一个与其他小部件按钮交互,等等。 我无意中发现了,但它明确指出ListView已被弃用,必须改用它

现在的问题是,至少对我来说,文档似乎不太清楚如何使用RecycleView。它肯定比其他小部件更复杂,我似乎无法理解

要将其分解为更容易理解的问题: 1.如何定义作为项目列表的RecycleView? 2.如何为其提供项目? 3.我如何与它交互,特别是一次只选择一个项目,检测何时选择某个项目,并在事件中自动选择某个项目

哦,顺便说一下,我更喜欢尽可能使用kv语言


如果您能帮助我查找或理解文档资源,使我能够更全面地理解这一点,以备将来使用,我将不胜感激。我真的希望在某个地方有一个关于这些复杂功能的教程,但是如果它存在的话,很难找到它。

下面的示例演示了如何使用Recycleview显示按钮列表,当选择每个按钮时,它会显示一个弹出窗口

实例 main.py 试验电压(千伏) 输出
我做了一个简单的例子。在我的示例中,可以用kv语言更改每行的布局,包括RecycleViewRow类中的小部件。 我已经在每行中放置了一个标签和一个按钮作为示例。 我希望这能帮助更多人

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.popup import Popup

Builder.load_string('''
#:kivy 1.10.0
#: import Popup kivy.uix.popup

<MessageBox>:
    title: 'Popup Message Box'
    size_hint: None, None
    size: 400, 400

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: root.message
        Button:
            size_hint: 1, 0.2
            text: 'OK'
            on_press: root.dismiss()

<RecycleViewRow>:
    orientation: 'horizontal'
    Label:
        text: root.text
    Button:
        text: 'Show'
        on_press: app.root.message_box(root.text)

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

class MessageBox(Popup):
    message = StringProperty()

class RecycleViewRow(BoxLayout):
    text = StringProperty()   

class MainScreen(RecycleView):    
    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        self.data = [{'text': "Button " + str(x), 'id': str(x)} for x in range(3)]

    def message_box(self, message):
        p = MessageBox()
        p.message = message
        p.open() 
        print('test press: ', message)

class TestApp(App):
    title = "RecycleView Direct Test"

    def build(self):
        return MainScreen()

if __name__ == "__main__":
    TestApp().run()

谢谢你的回答。显然,我仍然缺乏一些基本概念的理解,无法完全掌握代码的每一部分,但我会彻底研究它。谢谢。您在哪里定义RecycleBoxLayout?@shamilpython您不需要定义它,它是在模块kivy.uix.RecycleBoxLayout中定义的,但是使用的小部件是在类RecycleView中定义的。
#:kivy 1.10.0

<MessageBox>:
    title: 'Popup Message Box'
    size_hint: None, None
    size: 400, 400

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: app.root.rv_layout.selected_value
        Button:
            size_hint: 1, 0.2
            text: 'OK'
            on_press:
                root.dismiss()

<SelectableButton>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (0.0, 0.9, 0.1, 0.3)
        Rectangle:
            pos: self.pos
            size: self.size

<RV>:
    rv_layout: layout
    viewclass: 'SelectableButton'
    SelectableRecycleBoxLayout:
        id: layout
        default_size: None, dp(56)
        default_size_hint: 0.1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: "vertical"
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.popup import Popup

Builder.load_string('''
#:kivy 1.10.0
#: import Popup kivy.uix.popup

<MessageBox>:
    title: 'Popup Message Box'
    size_hint: None, None
    size: 400, 400

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: root.message
        Button:
            size_hint: 1, 0.2
            text: 'OK'
            on_press: root.dismiss()

<RecycleViewRow>:
    orientation: 'horizontal'
    Label:
        text: root.text
    Button:
        text: 'Show'
        on_press: app.root.message_box(root.text)

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

class MessageBox(Popup):
    message = StringProperty()

class RecycleViewRow(BoxLayout):
    text = StringProperty()   

class MainScreen(RecycleView):    
    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        self.data = [{'text': "Button " + str(x), 'id': str(x)} for x in range(3)]

    def message_box(self, message):
        p = MessageBox()
        p.message = message
        p.open() 
        print('test press: ', message)

class TestApp(App):
    title = "RecycleView Direct Test"

    def build(self):
        return MainScreen()

if __name__ == "__main__":
    TestApp().run()