Python 3.x Kivy RecycleView作为ListView的替代品?它是如何工作的?
我应该说,我还是Kivy的新手。 我试着寻找类似的问题,但它们要么过时了,要么不清楚 我正在寻找一些东西来显示元素列表,其中一个用户可以选择一个与其他小部件按钮交互,等等。 我无意中发现了,但它明确指出ListView已被弃用,必须改用它 现在的问题是,至少对我来说,文档似乎不太清楚如何使用RecycleView。它肯定比其他小部件更复杂,我似乎无法理解 要将其分解为更容易理解的问题: 1.如何定义作为项目列表的RecycleView? 2.如何为其提供项目? 3.我如何与它交互,特别是一次只选择一个项目,检测何时选择某个项目,并在事件中自动选择某个项目 哦,顺便说一下,我更喜欢尽可能使用kv语言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.我如何与它交互,特别是一次只选
如果您能帮助我查找或理解文档资源,使我能够更全面地理解这一点,以备将来使用,我将不胜感激。我真的希望在某个地方有一个关于这些复杂功能的教程,但是如果它存在的话,很难找到它。下面的示例演示了如何使用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()