Kivy文件选择器:仅列出目录

8
如何在Kivy FileChooser中仅列出目录?我已经了解了回调过滤器,但没有找到任何示例。
我的Kv代码:
<Saveto>:
    select: select
    chooser: chooser
    orientation: 'vertical'
    FileChooserIconView:
        id: chooser
        size_hint_y: 0.9
        rootpath: home
        dirselect: True
        filters: ['How to list folders only?']
    Button:
        ...select button...
4个回答

14

以下是一个例子:

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,因为它是一个列表,例如,一个回调函数的列表。


我的窗口会立即打开和关闭,这个解决方案是否已过时? - NaturalBornCamper
在我的Linux系统上可以运行。控制台日志有任何错误吗? - Nykakin
只是“进程以退出代码-1073741819(0xC0000005)结束”,日志中没有任何有用的信息。使用的是64位Windows 10操作系统。 - NaturalBornCamper
没有收到任何错误输出日志,只有一个退出代码。日志显示为正常应用程序,没有发生任何问题。 - NaturalBornCamper

3

您也可以直接在KV中完成:

<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...

2

如果您想使用没有任何文件的目录,可以使用以下方法:

Original Answer翻译成"最初的回答"

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()

最初的回答
希望能对您有所帮助。

0

这有点像是一个hack,但似乎可以工作,并且只能在kv文件中完成:

dirselect: True
filters: ['']

FileChooser中只显示文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接