从回收视图中将回收视图项目添加到另一个屏幕 - kivy

Posted

技术标签:

【中文标题】从回收视图中将回收视图项目添加到另一个屏幕 - kivy【英文标题】:add recycle view item to another screen from a recycle view- kivy 【发布时间】:2021-07-20 21:40:35 【问题描述】:

我有两个屏幕。 MainScreenPlaylistMainScreen 添加了一个 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的主要内容,如果未能解决你的问题,请参考以下文章

水平回收视图捕捉到中心,同时显示上一个/下一个项目

如何将值从一个片段的回收器视图项传递到另一个片段

在回收站视图中查找视图是不是在屏幕上

如何根据位置从“回收”视图中删除Firebase数据库密钥

当我单击我的回收站视图项目时,我的应用程序将崩溃

将项目添加到回收站视图的底部