Kivy 简明教程

Kivy - File Chooser

在 GUI 应用程序中,通常需要从本地文件系统中选择所需的文件。Kivy 框架提供了“kivy.uix.filechooser”模块,它提供了用于描述、显示和浏览文件系统的各种类。

filechooser 模块中的类采用 MVC 设计。它们可以分类如下 -

  1. ModelsFileSystemAbstract 类的具体实现表示,例如 FileSystemLocal

  2. ViewsFileChooserListLayoutFileChooserIconLayout 类表示。它们分别被 FileChooserListViewFileChooserIconView 控件使用。

  3. ControllersFileChooserController 的具体实现表示,即 FileChooser, FileChooserIconViewFileChooserListView 类。

FileChooserIconView 和 FileChooserListView 类提供了非常易于使用的控件,可使用两种不同的可视表示形式访问文件系统,如名称所示。

FileChooserListView 控件将文件和文件夹显示为垂直列表中的文本项。文件夹在其名称左侧用“>”符号标识,单击可展开或折叠其文件和子文件夹。

kivy file chooser

FileChooserIconView 控件显示一个文件夹图标,下面是名称,以及一个文件图标及其名称。

kivy filechoosericonview

如果文件/文件夹数超过控件的高度和宽度,则垂直和水平滚动条会附加到它。

文件选择器视图具有以下属性 -

  1. files − 应用筛选后,指定路径目录中的文件列表。files 是一个只读 ListProperty。

  2. filter_dirs − 表示筛选是否也应该应用于目录。filter_dirs 是一个 BooleanProperty,其默认值为 False。

  3. filters − filters 指定要应用于目录中的文件的筛选。filters 是一个 ListProperty,其默认值为 []。如果为空,它相当于 '*',表示没有文件被从该列表中筛选出来。当路径更改时,筛选不会重置。如果您需要重置,则需要自己执行此操作。

您可以在列表中指定一个或多个以下模式 −

Sr.No

Patterns List & Description

1

***matches everything

2

*?*matches any single character

3

[seq] 匹配 seq 中的任何字符

4

[!seq] 匹配不在 seq 中的任何字符

这两个视图都会引发事件 on_selection,对该事件可以绑定一个回调。生成此事件时,如果选择某个文件夹,将对其进行展开或折叠。如果选择某个文件,则将它的名称传递给回调。

ListView Example

在第一个示例中,我们通过在垂直框布局中使用一个 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 窗口小部件的 canvas 对象来提供背景色。

Kivy 应用程序类代码如下 −

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

Output

运行上述代码后,您将获得文件/文件夹列表。将会在标签上显示带其完整路径的文件的名称。

kivy file full path

IconView Example

我们现在演示如何使用 FileChooserIconView。它与在它旁边的一个 Image 窗口小部件一起放置在水平框中。虽然 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()

Output

运行该程序并浏览到所需图像文件。所选的图像将在右侧显示。

kivy file chooser image