¿Cómo seleccionar varios archivos con FileChooser con Kivy?

Estoy usando kivy y python para construir una aplicación.

Estoy tratando de construir una aplicación en la que pueda seleccionar varias imágenes, agregarlas a una matriz y luego pasar esta matriz de imágenes a través de otro método que une las imágenes (usando la clase de agrupador). La imagen de salida se mostrará en una de las tres pantallas (también quiero eliminar la pantalla central).

Esencialmente, en lo que me gustaría obtener ayuda es cómo poder seleccionar varios archivos con el filtro de archivos en Kivy y luego agregar estos archivos a la matriz que luego puedo pasar a través de un método diferente.

Con la ayuda de @ikolim en este post , he podido crear la aplicación.

main.py

from kivy.app import App from kivy.uix.tabbedpanel import TabbedPanel from kivy.properties import ObjectProperty from PIL import Image class RootWidget(TabbedPanel): manager = ObjectProperty(None) img = ObjectProperty(None) img3 = ObjectProperty(None) img4 = ObjectProperty(None) lab = ObjectProperty(None) def on_touch_up(self, touch): if not self.img3.collide_point(*touch.pos): return True else: self.lab.text = 'Pos: (%d,%d)' % (touch.x, touch.y) return True def switch_to(self, header): # set the Screen manager to load the appropriate screen # linked to the tab head instead of loading content self.manager.current = header.screen # we have to replace the functionality of the original switch_to self.current_tab.state = "normal" header.state = 'down' self._current_tab = header def select_to(self, *args): try: print(args[1][0]) iw = Image.open(args[1][0]) iw.save('./phase.jpg') gray = iw.convert('1') gray.save('./gray_im.jpg') self.img3.source = './gray_im.jpg' self.img4.source = './gray_im.jpg' self.img.source = './phase.jpg' self.img.reload() self.img3.reload() self.img4.reload() except: pass def update_touch_label(self, label, touch): label.text = 'Pos:(%d, %d)' % (touch.x, touch.y) label.texture_update() label.pos = touch.pos label.size = label.texture_size[0] + 20, label.texture_size[1] + 20 class TestApp(App): title = 'Screen Widget' def build(self): return RootWidget() def on_pause(self): return True if __name__ == '__main__': TestApp().run() 

Prueba.kv

 #:kivy 1.10.1 : manager: manager img: img img3: img3 img4: img4 lab: lab do_default_tab: False ScreenManager: id: manager Screen: id: sc1 name:'Load img' FileChooserIconView: canvas.before: Color: rgb: 0.5, 0.4, 0.5 Rectangle: pos: self.pos size: self.size on_selection: root.select_to(*args) Screen: id: sc2 name: 'Image' FloatLayout: Button: id: lab pos_hint: {"right": 0.55, 'top': 1} size_hint: .15,0.1 RelativeLayout: Image: id: img on_touch_down: str('Relative:{}'.format(args[1].pos)) pos_hint: {"left": 1, 'bottom': 1} size_hint: 0.5, 1 allow_stretch: True RelativeLayout: Image: id: img3 pos_hint: {"right": 1, 'bottom': 1} size_hint: 0.5, 1 allow_stretch: True Screen: id: sc3 name: 'Image_' FloatLayout: Image: id: img4 keep_data: True post: self.pos size: self.size TabbedPanelHeader: text: sc1.name background_color: 1, 0, 0, 1 screen: sc1.name TabbedPanelHeader: text: sc2.name background_color: 1, 1, 0, 1 screen: sc2.name TabbedPanelHeader: text: sc3.name background_color: 1, 0, 1, 1 screen: sc3.name 

Aquí hay un ejemplo que hace lo que creo que quieres:

 import os import kivy from kivy import platform from kivy.app import App from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout import kivy.garden.filebrowser class FileBrowserApp(App): def build(self): self.root = FloatLayout() button = Button(text='Select Files', pos_hint={'x':0, 'y': 0}, size_hint=(0.2, 0.1)) button.bind(on_press=self.do_select) self.root.add_widget(button) return self.root def do_select(self, *args): homeDir = None if platform == 'win': homeDir = os.environ["HOMEPATH"] elif platform == 'android': homeDir = os.path.dirname(os.path.abspath(__file__)) elif platform == 'linux': homeDir = os.environ["HOME"] self.fbrowser = kivy.garden.filebrowser.FileBrowser(select_string='Select', multiselect=True, filters=['*.png'], path=homeDir) self.root.add_widget(self.fbrowser) self.fbrowser.bind( on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled, on_submit=self._fbrowser_success) def _fbrowser_success(self, fbInstance): if len(fbInstance.selection) == 0: return selected = [] for file in fbInstance.selection: selected.append(os.path.join(fbInstance.path, file)) print('selected: ' + str(selected)) self.root.remove_widget(self.fbrowser) self.fbrowser = None def _fbrowser_canceled(self, instance): self.root.remove_widget(self.fbrowser) self.fbrowser = None if __name__=="__main__": app = FileBrowserApp() app.run()