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 отображаются только папки.