Kivy 简明教程
Kivy - File Chooser
在 GUI 应用程序中,通常需要从本地文件系统中选择所需的文件。Kivy 框架提供了“kivy.uix.filechooser”模块,它提供了用于描述、显示和浏览文件系统的各种类。
filechooser 模块中的类采用 MVC 设计。它们可以分类如下 -
-
Models 由 FileSystemAbstract 类的具体实现表示,例如 FileSystemLocal 。
-
Views 由 FileChooserListLayout 和 FileChooserIconLayout 类表示。它们分别被 FileChooserListView 和 FileChooserIconView 控件使用。
-
Controllers 由 FileChooserController 的具体实现表示,即 FileChooser, FileChooserIconView 和 FileChooserListView 类。
FileChooserIconView 和 FileChooserListView 类提供了非常易于使用的控件,可使用两种不同的可视表示形式访问文件系统,如名称所示。
FileChooserListView 控件将文件和文件夹显示为垂直列表中的文本项。文件夹在其名称左侧用“>”符号标识,单击可展开或折叠其文件和子文件夹。
FileChooserIconView 控件显示一个文件夹图标,下面是名称,以及一个文件图标及其名称。
如果文件/文件夹数超过控件的高度和宽度,则垂直和水平滚动条会附加到它。
文件选择器视图具有以下属性 -
-
files − 应用筛选后,指定路径目录中的文件列表。files 是一个只读 ListProperty。
-
filter_dirs − 表示筛选是否也应该应用于目录。filter_dirs 是一个 BooleanProperty,其默认值为 False。
-
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()
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()