【发布时间】:2019-04-02 03:01:40
【问题描述】:
我目前正在从事一个从 API 提取数据并使用 python 导出完全格式化的 excel 文档的项目。我现在所有后端代码都在工作(提取数据、构建列表和导出 excel 文档)我现在正在开发一个 Kivy UI 以供最终用户使用。 (我对 Kivy 很陌生,我正在学习它)
我的问题目前在我的第二页上。在这个页面上,他们有能力 选择一个事件类型,然后按日期范围搜索以查看他们可以从中选择的所有可能事件。我已经设置了列表,但现在我希望能够在屏幕右侧显示这些数据。在左侧,他们有所有的按钮和下拉菜单来缩小他们的搜索范围,而右侧应该只是某种可选择的列表。
我希望用户能够选择他们的搜索条件,然后点击一个按钮,该按钮会熄灭并拉出所有事件并将它们显示在列表中。他们应该能够更新他们的标准,然后再次点击搜索按钮来更新结果。
我一直在寻找使用 RecycleView,但我一直在寻找的所有示例都是 RecycleView 是在构建中返回的小部件,因此它占据了整个屏幕。我目前正在使用带有单个屏幕的屏幕管理器,并将屏幕设置为两个不同的 BoxLayout。我希望正确的 BoxLayout 包含 RecycleView。
对于 RecycleView,我追求的目标是否现实?它需要有自己的屏幕和自己的类吗?
这是我在测试时弄乱的一个示例,但我不确定如何在我自己的应用中实现类似的东西。
- self.data 与 root.text 有什么关系? self.data 是整个列表吗?
- 如何拥有多个列?
- 如果我想通过单击按钮更新数据,是否需要使用“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