【问题标题】:How to implement a RecycleView as a partial view that can be updated by a button press?如何将 RecycleView 实现为可以通过按下按钮更新的局部视图?
【发布时间】:2019-04-02 03:01:40
【问题描述】:

我目前正在从事一个从 API 提取数据并使用 python 导出完全格式化的 excel 文档的项目。我现在所有后端代码都在工作(提取数据、构建列表和导出 excel 文档)我现在正在开发一个 Kivy UI 以供最终用户使用。 (我对 Kivy 很陌生,我正在学习它)

我的问题目前在我的第二页上。在这个页面上,他们有能力 选择一个事件类型,然后按日期范围搜索以查看他们可以从中选择的所有可能事件。我已经设置了列表,但现在我希望能够在屏幕右侧显示这些数据。在左侧,他们有所有的按钮和下拉菜单来缩小他们的搜索范围,而右侧应该只是某种可选择的列表。

我希望用户能够选择他们的搜索条件,然后点击一个按钮,该按钮会熄灭并拉出所有事件并将它们显示在列表中。他们应该能够更新他们的标准,然后再次点击搜索按钮来更新结果。

我一直在寻找使用 RecycleView,但我一直在寻找的所有示例都是 RecycleView 是在构建中返回的小部件,因此它占据了整个屏幕。我目前正在使用带有单个屏幕的屏幕管理器,并将屏幕设置为两个不同的 BoxLayout。我希望正确的 BoxLayout 包含 RecycleView。

对于 RecycleView,我追求的目标是否现实?它需要有自己的屏幕和自己的类吗?

这是我在测试时弄乱的一个示例,但我不确定如何在我自己的应用中实现类似的东西。

  1. self.data 与 root.text 有什么关系? self.data 是整个列表吗?
  2. 如何拥有多个列?
  3. 如果我想通过单击按钮更新数据,是否需要使用“refresh_from_data(*largs, **kwargs)”?它是如何工作的?

如果有人可以帮助我朝着正确的方向前进,我可以弄清楚。我认为这个例子可能足以解决问题。

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()

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:
    1. self.data 与 root.text 有什么关系? self.data 是整个列表吗?

    每个RecycleViewRow 的root.text 由self.data 中每个项目的"text" 键填充。 self.data 是整个列表的数据。

    1. 如何拥有多个列?

    如果 RecycleViewRow 小部件创建时包含多列(例如,带有许多标签的水平 BoxLayout),则列表包含许多列。
    不要忘记该列表只是其viewclass 的许多小部件。

    1. 如果我想通过单击按钮更新数据,是否需要使用“refresh_from_data(*largs, **kwargs)”?它是如何工作的?

    是的。这只是告诉RecycleView 重新读取其数据(在此示例中为self.data)并重新填充列表。

    【讨论】:

    • 这很有意义。如何将 RecycleView 实现为屏幕的一部分?我希望 RecycleView 成为屏幕的一部分(一半),而不是整个屏幕。我如何有一个屏幕,左侧有一个按钮来刷新数据,右侧有 RecycleView?我发布的示例具有从 RecycleView 继承的主类,但我的是一个屏幕。另外您是如何知道文本键的?我发现kivy.org 的文档非常混乱。是否有一个完整的视频来逐个解释这些 RecycleVIews?我在它们的任何地方都找不到任何东西。
    • 你可以在你的主类(你的屏幕)中放置一个水平的BoxLayout。在BoxLayout 中,您可以添加两个孩子。 RecycleView 和 Button 用于重置。至于键,它们的工作方式是这样的。数据列表中的每一项都是一行。项目中的每个键都是viewclass 小部件的属性的值。是的,缺少文档,但所有的东西都在那里。谷歌搜索可以找到你所有的东西......;o)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多