如何在Kivy中获取使用fileChooser选择的文件的信息?

时间:2013-11-01 21:15:09

标签: python kivy filechooser

如何获取通过fileChooser选择的文件的信息?以下是我的一些代码:

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时打印实例中的路径和选择。当我选择一个文件并单击“确定”时,没有任何反应。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

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

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

这是对python语法的误用。问题是,您需要将函数传递给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函数接受一个函数和一些参数,并返回一个自动传递这些参数的新函数。这意味着当on_release发生时,bind实际上有一些东西要调用,而这反过来调用load_from_filechooser,而load_from_filechooser又调用你原来的加载函数。

你也可以不偏袒地做到这一点,但它是一种有用的通用技术,在这种情况下有助于(我认为)清楚地说明发生了什么。

我使用了对fileChooser的引用,因为你不能直接在函数中引用fileChooser.path和fileChooser.selection - 你只能在定义函数时得到它们的值。这样,我们跟踪fileChooser本身,并且仅在稍后调用该函数时提取路径和选择。