Kivy FileChooser: список только каталогов

Как перечислить только каталоги в Kivy FileChooser? Я играл с фильтром:

filters: ['Directories, not files!']

но файлы перечислены снова. Я читал об фильтрах обратного вызова, но не нашел примеров.

Мой код Kv:

<Saveto>:
    select: select
    chooser: chooser
    orientation: 'vertical'
    FileChooserIconView:
        id: chooser
        size_hint_y: 0.9
        rootpath: home
        dirselect: True
        filters: ['How to list only folders?']
    Button:
        ...select button...

4 ответа

Решение

Вот пример:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

from os.path import join, isdir

Builder.load_string("""
<MyWidget>:
    FileChooserListView:
        filters: [root.is_dir]
""")

class MyWidget(BoxLayout):
    def is_dir(self, directory, filename):
        return isdir(join(directory, filename))

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()

Обратите внимание, что свойство называется filtersне filterпотому что это список, например, список обратных вызовов.

Вы также можете сделать это напрямую в КВ:

<Saveto>:
    select: select
    chooser: chooser
    orientation: 'vertical'
    FileChooserIconView:
        id: chooser
        size_hint_y: 0.9
        rootpath: home
        dirselect: True
        filters: [lambda folder, filename: not filename.endswith('')]
    Button:
        ...select button...

Если вы хотите использовать каталог без какого-либо файла, вы можете использовать:

os.path.dirname(filename)

следующим образом (пример, в котором каталог используется только для печати каталога в виде метки в правой части экрана):

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.lang import Builder
import os


Builder.load_string("""
<MyWidget>:
    FileChooserIconView:
        filters: [root.selected]
    BoxLayout:
        Label:
            id: mypath
            text: ''
""")

class MyWidget(BoxLayout):
    def selected(self, directory, filename):
        self.ids.mypath.text = os.path.dirname(filename)


class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()

Надеюсь, поможет

Это немного похоже на взлом, но, похоже, он работает и может быть выполнен только в файле kv:

      dirselect: True
filters: ['']

В FileChooser отображаются только папки.

Другие вопросы по тегам