如何获取通过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时打印实例中的路径和选择。当我选择一个文件并单击“确定”时,没有任何反应。
答案 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本身,并且仅在稍后调用该函数时提取路径和选择。