¿Cómo obtengo información de un archivo seleccionado con fileChooser en Kivy?

¿Cómo obtengo información de un archivo que selecciono a través del fileChooser? Aquí hay algunos trozos de código que tengo:

self.fileChooser = fileChooser = FileChooserListView(size_hint_y=None, path='/home/') ... btn = Button(text='Ok') btn.bind(on_release=self.load(fileChooser.path, fileChooser.selection)) ... def load(self, path, selection): print path, selection 

Lo que esto hace es imprimir la ruta y la selección en la instancia cuando abro inicialmente el fileChooser. Cuando selecciono un archivo y hago clic en “Aceptar”, no pasa nada.

 btn.bind(on_release=self.load(fileChooser.path, fileChooser.selection)) ... def load(self, path, selection): print path, selection 

Este es un mal uso de la syntax de Python. El problema es que necesita pasar una función a btn.bind. La función se almacena, luego, cuando ocurre el evento on_release , se llama a la función.

Lo que has hecho no es pasar la función, sino simplemente llamarlo y pasar el resultado. Es por eso que ves la ruta y la selección impresas una vez que abres el archivo – es la única vez que se llama a la función.

En su lugar, debe pasar la función real a la que desea llamar. Debe tener un poco de cuidado aquí debido al scope variable, y existen múltiples soluciones potenciales. A continuación se muestran los fundamentos de una posibilidad:

 def load_from_filechooser(self, filechooser): self.load(filechooser.path, filechooser.selection) def load(self, path, selection): print path, selection ... from functools import partial btn.bind(on_release=partial(self.load_from_filechooser, fileChooser)) 

La función partial toma una función y algunos argumentos, y devuelve una nueva función que automáticamente pasa esos argumentos. Eso significa que bind realmente tiene algo que llamar cuando ocurre on_release, que a su vez llama a load_from_filechooser que a su vez llama a su función de carga original.

También puede hacer esto sin parcialidad, pero es una técnica general útil y, en este caso, ayuda (creo) a aclarar lo que está sucediendo.

Usé una referencia a fileChooser porque no puede hacer referencia a fileChooser.path y fileChooser.selection directamente en su función; solo obtendría sus valores en el momento en que se define la función. De esta manera, rastreamos el propio fileChooser y solo extraemos la ruta y la selección cuando la función se llama más tarde.

Este ejemplo podría ayudarte:

 import kivy from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder import os Builder.load_string(""" : id: my_widget Button text: "open" on_release: my_widget.open(filechooser.path, filechooser.selection) FileChooserListView: id: filechooser on_selection: my_widget.selected(filechooser.selection) """) class MyWidget(BoxLayout): def open(self, path, filename): with open(os.path.join(path, filename[0])) as f: print f.read() def selected(self, filename): print "selected: %s" % filename[0] class MyApp(App): def build(self): return MyWidget() if __name__ == '__main__': MyApp().run()