2013-11-01 2 views
2

Как получить информацию о файле, который я выбираю через fileChooser? Вот некоторые куски кода у меня есть:Как получить информацию о файле, выбранном с помощью fileChooser в Kivy?

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 

Что это делает печать путь и выбор в случае, когда я сначала открыть fileChooser. Когда я выбираю файл и нажимаю «Ok», ничего не происходит.

+0

Вот пример использования filechooser.https: //www.youtube.com/watch? V = 6x1gUNoVB2I –

ответ

2
btn.bind(on_release=self.load(fileChooser.path, fileChooser.selection)) 

... 
def load(self, path, selection): 
    print path, selection 

Это злоупотребление синтаксиса питона. Проблема в том, что вам нужно передать функцию на btn.bind. Функция сохраняется, а затем, когда происходит событие on_release, вызывается функция.

Что вы сделали, это не пропуск функции, а просто вызвать ее и передать результат. Вот почему вы видите, что путь и выбор печатаются один раз, когда вы открываете filechooser - это тот единственный момент, когда функция фактически вызывается.

Вместо этого вам необходимо передать фактическую функцию, которую вы хотите вызвать. Вы должны быть немного осторожны здесь из-за переменного охвата, и есть много потенциальных решений. Ниже основа одной возможности:

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

partial функция принимает функцию и некоторые аргументы, и возвращает новую функцию, которая автоматически передает эти аргументы. Это означает, что bind действительно имеет что-то для вызова, когда происходит on_release, что в свою очередь вызывает load_from_filechooser, который, в свою очередь, вызывает вашу исходную функцию загрузки.

Вы также можете сделать это без частичной, но это полезная общая техника, и в этом случае помогает (я думаю), чтобы дать понять, что происходит.

Я использовал ссылку на fileChooser, потому что вы не можете ссылаться на fileChooser.path и fileChooser.selection непосредственно в своей функции - вы получите только их значения во время определения функции. Таким образом, мы отслеживаем файл fileChooser и извлекаем только путь и выбор, когда функция будет вызвана позже.

6

Этот пример может помочь вам:

import kivy 

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.lang import Builder 

import os 

Builder.load_string(""" 
<MyWidget>: 
    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()