Kivy - 檔案選擇器



在 GUI 應用中,您經常需要從本地檔案系統中選擇所需檔案。Kivy 框架提供“kivy.uix.filechooser”模組,其中包含用於描述、顯示和瀏覽檔案系統的各種類。

filechooser 模組中的類採用 MVC 設計。它們可以分為如下幾類:

  • 模型FileSystemAbstract類的具體實現表示,例如FileSystemLocal

  • 檢視FileChooserListLayoutFileChooserIconLayout類表示。這些分別由FileChooserListViewFileChooserIconView元件使用。

  • 控制器FileChooserController的具體實現表示,即FileChooser、FileChooserIconViewFileChooserListView類。

FileChooserIconView 和 FileChooserListView 類提供非常易於使用的元件,它們以兩種不同的視覺表示方式提供對檔案系統的訪問,正如其名稱所示。

FileChooserListView 元件以垂直列表中文字項的形式顯示檔案和資料夾。資料夾左側用“>”符號標識,單擊可以展開或摺疊其檔案和子資料夾。

Kivy File Chooser

FileChooserIconView 元件顯示資料夾圖示及其名稱,以及檔案圖示及其名稱。

kivy FileChooserIconView

如果檔案/資料夾數量超過元件的高度和寬度,則會附加垂直和水平捲軸。

FileChooser 檢視具有以下屬性:

  • files - 應用過濾器後,路徑指定的目錄中的檔案列表。files 是一個只讀 ListProperty。

  • filter_dirs - 指示過濾器是否也應應用於目錄。filter_dirs 是一個 BooleanProperty,預設為 False。

  • filters - filters 指定要應用於目錄中檔案的過濾器。filters 是一個 ListProperty,預設為 []。如果為空,則等效於 '*',表示沒有檔案被過濾掉。路徑更改時,過濾器不會重置。如果需要,您需要自己重置。

您可以在列表中指定一個或多個以下模式:

序號 模式列表和描述
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 元件的 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()

輸出

執行上述程式碼後,您將獲得檔案/資料夾列表。檔案及其完整路徑的名稱將顯示在標籤上。

Kivy File Full Path

IconView 示例

現在我們展示 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()

輸出

執行程式並瀏覽到所需的影像檔案。選定的影像將顯示在右側。

Kivy File Chooser Image
廣告
© . All rights reserved.