从回收视图中将回收视图项目添加到另一个屏幕 - kivy
Posted
技术标签:
【中文标题】从回收视图中将回收视图项目添加到另一个屏幕 - kivy【英文标题】:add recycle view item to another screen from a recycle view- kivy 【发布时间】:2021-07-20 21:40:35 【问题描述】:我有两个屏幕。 MainScreen
和 Playlist
。 MainScreen
添加了一个 RecycleView
方法来显示项目列表。这些项目是从文件夹名称(目录)创建的。我希望每个文件夹(目录)中的文件在 Playlist
屏幕上打开,具体取决于单击的目录名称。
我打算在用户离开屏幕后立即清除屏幕。
from kivymd.app import MDApp
from kivymd.uix.button import MDFlatButton, MDRectangleFlatButton
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.screen import MDScreen
from pathlib import Path, PurePath
# Music Path
storageLocation = Path.cwd()
if Path('Books').is_dir():
storageLocation = Path.cwd() / 'Books'
class RecycleViewRow(BoxLayout):
text = StringProperty()
class MainScreen(MDScreen):
def __init__(self, **kwargs):
super(MainScreen, self).__init__(**kwargs)
booksdir = [f for f in storageLocation.iterdir() if f.is_dir()]
self.children[0].data = ['text': str(x), 'id': str(x) for x in booksdir]
# print(self.children[0].data)
class Playlist(MDScreen):
def on_pre_enter(self, *args):
self.ids.Box.clear_widgets()
#self.ids.Box.add_widget(MDRectangleFlatButton(text="done", ))
print(self.manager.ids)
return
class Main(MDApp):
def build(self):
sm = ScreenManager()
sm.add_widget(MainScreen(name='MainScreen'))
sm.add_widget(Playlist(name='Playlist'))
sm.add_widget(Test(name="Test"))
return sm
Main().run()
.kv
<RecycleViewRow>:
orientation: 'vertical'
Button:
text: root.text
#on_press: app.root.message_box(root.text)
on_release:app.root.current = 'Playlist'
<MainScreen>:
RecycleView:
id: rv
viewclass: 'RecycleViewRow'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
<Playlist>
BoxLayout:
orientation: 'vertical'
id:Box
【问题讨论】:
【参考方案1】:您可以从您的RecycleViewRow
触发一个方法,如下所示:
<RecycleViewRow>:
orientation: 'vertical'
Button:
text: root.text
on_release: app.fill_playlist(root.text)
然后,fill_playlist()
方法。你可以填写PlayList
:
def fill_playlist(self, dir):
self.root.current = 'Playlist' # this also clears the play list
playlist = self.root.get_screen('Playlist')
for sub in os.listdir(dir):
playlist.ids.Box.add_widget(MDRectangleFlatButton(text=sub))
【讨论】:
很抱歉,在测试过程中我发现了导致黑屏的问题。代码按原样工作,无需更改任何内容。我的应用程序快完成了。 @John Anderson 拯救了这一天Pathlib
怎么能给出相同的结果。 dir.iterdir
返回一个 str
错误以上是关于从回收视图中将回收视图项目添加到另一个屏幕 - kivy的主要内容,如果未能解决你的问题,请参考以下文章