Kivy - 文件选择器
在 GUI 应用程序中,您经常需要从本地文件系统中选择所需的文件。Kivy 框架提供了"kivy.uix.filechooser"模块,该模块提供了用于描述、显示和浏览文件系统的各种类。
filechooser 模块中的类采用 MVC 设计。它们可以归类如下 −
模型由 FileSystemAbstract 类的具体实现表示,例如 FileSystemLocal。
视图由 FileChooserListLayout 和 FileChooserIconLayout 类表示。它们分别由 FileChooserListView 和 FileChooserIconView 小部件使用。
控制器由 FileChooserController 的具体实现表示,即 FileChooser、FileChooserIconView 和 FileChooserListView 类。
FileChooserIconView 和 FileChooserListView 类提供了非常简单易用的小部件,它们通过两种不同的可视化表示提供对文件系统的访问,正如名称所暗示的那样。
FileChooserListView 小部件将文件和文件夹显示为垂直列表中的文本项。文件夹由其名称左侧的">"符号标识,单击可展开或折叠其文件和子文件夹。
FileChooserIconView 小部件显示一个文件夹图标,其下方显示名称,以及一个文件图标及其名称。
如果文件/文件夹的数量超出小部件的高度和宽度,则会附加垂直和水平滚动条。
FileChooser 视图具有以下属性 −
files − 应用过滤器后,由路径指定的目录中的文件列表。 files 是一个只读 ListProperty。
filter_dirs − 表示过滤器是否也应用于目录。filter_dirs 是一个 BooleanProperty,默认为 False。
filters − filters 指定要应用于目录中文件的过滤器。filters 是一个 ListProperty,默认为 []。如果为空,则相当于 '*',表示没有文件被从列表中过滤掉。路径更改时不会重置过滤器。如果需要,您需要自己执行此操作。
您可以在列表中指定以下一个或多个模式 −
| Sr.No | 模式列表和说明 |
|---|---|
| 1 | * 匹配所有内容 |
| 2 | ? 匹配任何单个字符 |
| 3 | [seq] 匹配 seq 中的任何字符 |
| 4 | [!seq] 匹配 seq 之外的任何字符 |
两个视图都会引发 on_selection 事件,回调可以绑定到该事件。生成此事件时,如果选择了文件夹,它将展开或折叠该文件夹。如果选择了文件,则将其名称传递给回调。
ListView 示例
在第一个示例中,我们使用 FileChhoserListView 小部件和垂直框布局中的标签构建 App 窗口。
为此目的使用以下"kv"文件脚本。select() 方法绑定到视图的"on_selection"事件。
<Filechooser>:
label: label
orientation: 'vertical'
BoxLayout:
FileChooserListView:
canvas.before:
Color:
rgb: .4, .5, .5
Rectangle:
pos: self.pos
size: self.size
on_selection: root.select(*args)
Label:
id: label
size_hint_y: .1
canvas.before:
Color:
rgb: .5, .5, .4
Rectangle:
pos: self.pos
size: self.size
请注意使用 FileChooseListView 和 Label 小部件的画布对象来提供背景颜色。
Kivy Application 类代码如下−
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
Window.size = (720,400)
class Filechooser(BoxLayout):
def select(self, *args):
try: self.label.text = args[1][0]
except: pass
class FileDemoApp(App):
def build(self):
return Filechooser()
if __name__ == '__main__':
FileDemoApp().run()
输出
运行上述代码后,您将获得文件/文件夹列表。文件的名称及其完整路径显示在标签上。
IconView 示例
我们现在展示 FileChooserIconView 的使用。它被放置在一个水平框中,旁边还有一个图像小部件。虽然 FileChooserIconView 的大部分配置与上一个示例相同,但我们添加了 filters 属性以将文件的显示限制为仅 png 文件。
<Filechooser>:
img: img
orientation: 'horizontal'
BoxLayout:
FileChooserIconView:
filters: ['*.png']
canvas.before:
Color:
rgb: .5, .4, .5
Rectangle:
pos: self.pos
size: self.size
on_selection: root.select(*args)
Image:
id: img
source:""
由于我们想要显示选定的图像,因此 select() 方法被更改,以便将选定的文件分配给 Image 对象的 source 属性。
class Filechooser(BoxLayout):
def select(self, *args):
try:
self.img.source = args[1][0]
except:
print ('error')
class FileIconApp(App):
def build(self):
return Filechooser()
# run the App
if __name__ == '__main__':
FileIconApp().run()
输出
运行该程序并浏览至所需的图像文件。 选定的图像将显示在右侧。

